ELF格式文件的粗浅理解

介绍

image
C语言是给人看的,机器看不懂,所以要把C程序代码转换成机器可以识别的二进制,机器才能执行。C程序代码转换成二进制如上图所示,需要经过预处理、编译、汇编和连接过程,最终生成一个可执行文件。

在linux系统中,图中的relocatable file 和 executable file 都是ELF(Executable Linkable Format)格式的 object file。
Windows是PE(Portable Executable)格式。
它们都是COFF(Common file format)格式的变种。

这里讲的是适用于Linux的,一种叫ELF的object file文件格式,主要用于以下三种object file:

  1. relocatable file,包含适合与其他object file链接以创建新的 executable/shared object file 的代码和数据。
  2. executable file,包含适合执行的程序。
  3. shared object file ,暂不研究。

接下来的讲解默认 Object file 为 ELF 格式。

文件格式

Object file 参与程序连接(建立程序)和程序执行(运行一个程序)。为了方便和效率,object file 提供了并行的文件内容的视图,下图展示了 object file 的结构。
image

ELF Header在文件的开头,用以存储该文件的基本信息,描述文件的基本结构。

Section为 Linking View 保存了大量的信息如指令、数据、符号表、重定位等。比如我们的代码存在了.text Section中,未赋值变量存在了 .bss Section中。

一个Segment里面包含几个性质相同的Section,为什么要这样做可以看《程序员的自我修养》第六章第四节。

Program header table,当它存在的时候,它告诉系统怎么去创造一个 process image(程序映像) 。如果这个 object file 是用于构建 process image(也就是当作程序执行)的话,必须包含有 program header table。如果是 relocatable file 则不需要 program header table。

Section header table 包含描述 section 的信息。每个 Section 都有相应的条目在 section header table 中,条目提供setion name、section size 等信息。object file 用来连接的时候必须含有 section header table,其他不是用于连接的 object file 可以有 section header table 也可以没有。

NOTE:除了 ELF Header 位于 ELF 头部,其他 table 或者 section 的位置都是不固定的

暂时写到这里,详情见原文:https://pdos.csail.mit.edu/6.828/2018/readings/elf.pdf

posted @ 2021-11-20 15:15  Pril  阅读(81)  评论(0)    收藏  举报