ELF (Executable and Linking Format) 最早由Unix系统实验室(USL)作为ABI (Application Binaray Interface) 的一部分发布。TIS (Tool Interface Standard) 协会选择ELF作为32位Intel架构下各种操作系统的可移植目标文件格式。TIS 在1993年发布了1.1版本的ELF标准,1995年发布了1.2版本的ELF标准。1997年,System V ABI 4.1 也包含了ELF相关的规范,后续的4.1+,包含了一些更新。Linux Stardard Base Core specification 4.1 包含一些和Linux相关的规范。
ARM在其ABI规范中,定义了处理器相关的ELF内容。
主要有3种类型的目标文件格式:
1. 可重定向目标文件
2. 可执行目标文件
3. 共享目标文件
上述3种类型分别对应:.o文件、可执行文件和共享库。静态库只是.o文件的集合,不是一种目标文件格式。链接视角的目标文件格式如下:
ELF header |
Program header table (optional) |
Section 1 |
… |
Section n |
Section header table |
执行视角的目标文件格式如下:
ELF header |
Program header table |
Segment 1 |
… |
Segment n |
Section header table (optional) |
上述,只有ELF header固定在文件的开头位置,其它的Porgram header table等可以出现在任意位置。但是使用readelf工具读取ELF文件可以发现,上述两种布局方式就是GNU工具使用的布局方式。
ELF header包含ELF文件的基本信息。
Section header table包含sections信息,每个section在表中占据一个条目。Sections包含了指令、数据、符号表、重定向等信息。链接阶段的文件(.o)必须要有Section header table,可执行文件不必要有Section header table。
Program header table告诉系统如何创建进程镜像。可执行文件必须有Program header table。