返回
Featured image of post 什么是ELF?

什么是ELF?

ELF格式解析

什么是ELF?

定义

wikipedia中的定义为:

可执行与可链接格式 (英语:Executable and Linkable Format,缩写 ELF,此前的写法是 Extensible Linking Format),常被称为 ELF格式,在计算中,是一种用于可执行文件、目标代码共享库核心转储(core dump)的标准文件格式

文件格式

每个 ELF 文件都由一个 ELF 首部和紧跟其后的文件数据部分组成。数据部分可以包含:

  • 程序头表(Program header table):描述 0 个或多个内存段信息
  • 分段头表(Section header table):描述 0 段或多段链接与重定位需要的数据
  • 程序头表与分段头表引用的数据,比如 .text .data

Ange Albertini,CC BY 1.0

内存段中包含了用于某个 ELF 文件运行时执行所需的信息,而片段中包含了用于链接和重定位的重要数据。整个文件中的任何一个字节至多只能属于一个片段,也就是说可能存在不属于任何片段的孤立字节

由Surueña - 自己的作品,CC BY-SA 3.0,https://commons.wikimedia.org/w/index.php?curid=2922583

ELF文件有两种索引:程序标头中记载了运行时所需的段,而段首地址表记载了二进制文件中段的首地址

ELF Header

ELF Header定义是使用 32 位还是 64 位地址。 Header包含三个受此设置影响的字段,并偏移它们后面的其他字段。 对于 32 位和 64 位二进制文件,ELF Header的长度分别为 52 或 64 字节。

ELF Header的具体细节参见:http://www.sco.com/developers/gabi/2000-07-17/ch4.eheader.html

具体每一字节含义可以参见:https://en.wikipedia.org/wiki/Executable_and_Linkable_Format

ELF Header中记录系统位数,字节序,OS/ABI,系统架构,程序入口地址,程序头表和分段头表的地址和大小等信息。

在Linux系统中,可以通过readelf -h xxx来读取程序ELF Header

Program header table

程序头是对二进制文件中段的描述,是程序装载必须的一部分。段(segment) 是在内核装载时被解析的。这个段不是内存中的段,内存中的段是记录在全局描述符表中的。程序头描述的段是磁盘上程序中的一个段,常见的如代码段和数据段.主要作用就是描述磁盘上可执行文件的内存布局以及如何映射到内存中。

program header table详细数据结构见:http://www.sco.com/developers/gabi/2000-07-17/ch5.pheader.html

program header table布局见:https://en.wikipedia.org/wiki/Executable_and_Linkable_Format

在linux中可以使用read --wide --segments xxx查看程序的program头

该程序的二进制文件如下:

图中标注出了program header table的部分表项,与program header表项的内存布局对照,很容易就可以翻译出program header的信息。

Licensed under CC BY-NC-SA 4.0