三大格式演進脈絡
| 格式 | 全稱 | 時代 | 關鍵特性 |
| a.out | Assembler and Link Editor Output | 早期 UNIX | 簡單、固定區段、無動態連結支援 |
| COFF | Common Object File Format | System V UNIX | 引入區段表、支援更多區段、擴展性強 |
| ELF | Executable and Linking Format | 現代標準 (SVR4, Linux, BSD) | 靈活區段、完整動態連結、跨平台、可擴展 |
ELF 載入流程核心
- 核心讀取 ELF 標頭,驗證魔數、架構、入口點
- 解析程式標頭表,載入
PT_LOAD 區段到記憶體
- 處理
PT_INTERP 載入動態連結器
- 建立堆疊環境,傳遞參數給動態連結器
- 動態連結器解析
.dynamic 區段,載入依賴庫
- 執行重定位 (Lazy/Now Binding)
- 執行
.init_array / .init 初始化
- 跳轉入口點 (
_start → __libc_start_main → main)
三格式詳細對比
a.out 格式
- 固定標頭:
exec 結構體
- 固定區段:text、data、bss
- 無區段表,擴展性極差
- 符號表格式簡單,不支援動態連結
COFF 格式
- 檔案標頭 + 選擇性標頭 + 區段表
- 選擇性標頭 (
COFF_AOUTHDR) 包含:magic(0x107)、入口點、text/data/bss 基址
- 區段表 (
COFF_SCNHDR):名稱、虛擬/物理地址、大小、重定位/行號資訊
- Linux 下選擇性標頭必須存在,
magic=0413 表示可執行
- 支援擴展:XCOFF (AIX)、ECOFF (MIPS)
ELF 格式優勢
- 雙重視圖:連結視圖 (區段表) + 執行視圖 (程式標頭表)
- 區段屬性豐富:類型、標誌、地址、對齊、實體大小
- 動態連結完整支援:
.dynamic、.dynsym、.got/.plt
- 跨架構支援:32/64位、大小端、多架構統一格式
- 可擴展性:新區段類型、標誌位持續擴展
ELF 標頭關鍵結構
typedef struct {
unsigned char e_ident[16]; // 魔數、類別、資料編碼、版本
Elf32_Half e_type; // ET_EXEC, ET_DYN, ET_DYN...
Elf32_Half e_machine; // EM_386, EM_X86_64, EM_ARM...
Elf32_Word e_version; // EV_CURRENT
Elf32_Addr e_entry; // 入口點虛擬地址
Elf32_Off e_phoff; // 程式標頭表偏移
Elf32_Off e_shoff; // 區段標頭表偏移
Elf32_Word e_flags; // 處理器特定旗標
Elf32_Half e_ehsize; // ELF 標頭大小
Elf32_Half e_phentsize; // 程式標頭項大小
Elf32_Half e_phnum; // 程式標頭項數
Elf32_Half e_shentsize; // 區段標頭項大小
Elf32_Half e_shnum; // 區段標頭項數
Elf32_Half e_shstrndx; // 區段名字串表索引
} Elf32_Ehdr;
關鍵區段對比表
| 功能 | a.out | COFF | ELF |
| 程式碼區段 | .text | .text | .text (SHT_PROGBITS, SHF_ALLOC|SHF_EXECINSTR) |
| 初始化資料 | .data | .data | .data (SHT_PROGBITS, SHF_ALLOC|SHF_WRITE) |
| 未初始化資料 | .bss | .bss | .bss (SHT_NOBITS, SHF_ALLOC|SHF_WRITE) |
| 符號表 | 固定格式 | 符號表區段 | .symtab/.dynsym (SHT_SYMTAB/DYNSYM) |
| 重定位資訊 | 固定格式 | 重定位區段 | .rela.* (SHT_RELA) |
| 動態連結資訊 | 不支援 | 需擴展 (XCOFF) | .dynamic, .dynsym, .got, .plt |
| 區段表 | 無 | 有 (固定格式) | 靈活區段表 (SHT_*) |
總結
ELF 以靈活的區段架構、完整的動態連結支援、跨平台能力成為現代標準。區段表的引入是 COFF 相對 a.out 最大突破,ELF 進一步將區段機制一般化、標準化,實現連結視圖與執行視圖分離,成為現代系統軟體基礎設施基石。