可執行與可鏈接格式

可执行与可链接格式(英語:Executable and Linkable Format,缩写 ELF,此前的写法是Extensible Linking Format),常被称为ELF格式,在计算中,是一种用于可执行文件、目标代码共享库核心转储(core dump)的标准文件格式。首次发布于一个名为System V Release 4(SVR4)的Unix操作系统版本中关于应用二进制接口(ABI)的规范中,并且此后不久发布于工具接口标准(Tool Interface Standard)[1],随后很快被不同Unix发行商所接受。1999年,这种格式被86open项目选为x86架构处理器上的Unix和类 Unix系统的标准二进制文件格式。

ELF
扩展名
无扩展名, .o, .so, .elf, .prx, .axf, .bin, .puff, .ko, .mod
开发者Unix系统实验室
格式类型二进制文件可执行文件目标代码共享库核心转储
作为容器多种二进制可执行文件格式
ELF文件有两种索引:程序标头中记载了运行时所需的“段”,而段首地址表记载了二进制文件中“段”的首地址

按照设计,ELF格式灵活性高、可扩展,并且跨平台。比如它支持不同的字节序和地址范围,所以它不会不兼容某一特别的CPU指令架构。这也使得ELF格式能够被运行于众多不同平台的各种操作系统所广泛采纳。

文件格式

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

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

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

00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............|

00000010 02 00 3e 00 01 00 00 00 c5 48 40 00 00 00 00 00 |..>......H@.....|

ELF 文件首部的 16 进制内容举例

技术规范

  • 通用:
    • System V Application Binary Interface[2] 4.1版​(1997年3月18日)
    • System V ABI Update[3]​(2009年10月)
  • AMD64
    • System V ABI, AMD64 Supplement[4]
  • Arm:
    • ELF for the ARM Architecture[5]
  • IA-32
    • System V ABI, Intel386 Architecture Processor Supplement[6]
  • IA-64
    • Itanium Software Conventions and Runtime Guide[7]​(2000年9月)
  • M32R
    • M32R ELF ABI Supplement[8] 1.2版​(2004年8月26日)
  • MIPS
    • System V ABI, MIPS RISC Processor Supplement[9]
    • MIPS EABI documentation[10]​(2003年6月11日)
  • Motorola 6800
    • Motorola 8- and 16- bit Embedded ABI[11]
  • PA-RISC
    • ELF Supplement for PA-RISC[12] 1.43版​(1997年10月6日)
  • PowerPC
    • System V ABI, PPC Supplement[13]
    • PowerPC Embedded Application Binary Interface[14] 32-Bit Implementation​(1995年10月1日)
    • 64-bit PowerPC ELF Application Binary Interface Supplement[15] 1.9版​(2004年)
  • RISC-V
    • RISC-V ELF Specification[16]
  • SPARC
    • System V ABI, SPARC Supplement[17]
  • S/390
    • S/390 32bit ELF ABI Supplement[18]
  • zSeries
    • zSeries 64bit ELF ABI Supplement[19]
  • Symbian OS 9:
    • E32Image file format on Symbian OS 9[20]

Linux标准规范(LSB)增修了上述一些规格中所指定的架构中相关的部分。[21]例如关于System V ABI、AMD64 Supplement的案例。[22][23]

工具

  • GNU Binutils 是用来处理许多格式的目标文件(包括elf文件)一整套的编程语言工具程序,包括readelf,objdump,objcopy, nm, strings, strip, as, ar。
  • readelf显示elf文件
  • objdump显示elf和object格式文件,解码elf文件中高级语言语句所对应的机器语言语句段落,汇编语言语句段落。
  • nm显示elf文件中变量名和地址

引用

  1. ^ Tool Interface Standard (TIS) Executable and Linking FOrmat (ELF) SpecificationVersion 1.2 (May 1995)
  2. ^ System V Application Binary Interface页面存档备份,存于互联网档案馆
  3. ^ System V ABI Update页面存档备份,存于互联网档案馆
  4. ^ System V ABI, AMD64 Supplement
  5. ^ ELF for the ARM Architecture
  6. ^ System V ABI, Intel386 Architecture Processor Supplement页面存档备份,存于互联网档案馆
  7. ^ Itanium Software Conventions and Runtime Guide页面存档备份,存于互联网档案馆
  8. ^ M32R ELF ABI Supplement页面存档备份,存于互联网档案馆
  9. ^ System V ABI, MIPS RISC Processor Supplement页面存档备份,存于互联网档案馆
  10. ^ MIPS EABI documentation页面存档备份,存于互联网档案馆
  11. ^ Motorola 8- and 16- bit Embedded ABI页面存档备份,存于互联网档案馆
  12. ^ ELF Supplement for PA-RISC
  13. ^ System V ABI, PPC Supplement
  14. ^ PowerPC Embedded Application Binary Interface
  15. ^ 64-bit PowerPC ELF Application Binary Interface Supplement页面存档备份,存于互联网档案馆
  16. ^ RISC-V ELF Specification页面存档备份,存于互联网档案馆
  17. ^ System V ABI, SPARC Supplement
  18. ^ S/390 32bit ELF ABI Supplement
  19. ^ zSeries 64bit ELF ABI Supplement
  20. ^ E32Image file format on Symbian OS 9
  21. ^ LSB Referenced Specifications. linuxfoundation.org. [27 April 2015]. (原始内容存档于2019-07-07). 
  22. ^ Executable and Linking Format (ELF). linuxfoundation.org. [27 April 2015]. (原始内容存档于2021-12-01). 
  23. ^ Introduction. linuxfoundation.org. [27 April 2015]. (原始内容存档于2022-03-24).