可執行與可鏈結格式

可執行與可連結格式(英語: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).