ELF(Executable and Linkable Format)是 UNIX 系統通用的可執行文件標準格式,分為三種類型:可重定位目標文件、可執行文件、共享庫。本文通過分析匯編生成的 max.o 與鏈接後的 max,揭示匯編、鏈接、加載執行的完整過程。
ELF 文件根據使用階段呈現兩種視圖:

關鍵點:
.symtab)不屬於任何 Segment,不加載入內存。
操作系統:UNIX,架構:80386。8 個 Section Header,文件偏移 0xc8,每項 40 字節。無 Program Header。

.text、.data:源碼中 .section 聲明的段。.bss:未初始化全局變量,文件中不佔空間,僅在 Section Header 中記錄大小,加載時清零。.shstrtab、.strtab:分別存儲 Section 名稱與符號名稱的字符串表(以 \0 結尾)。.symtab:符號表。Ndx 指示所在 Section 索引,Value 為相對地址。_start 為全局符號,其餘局部。.rel.text:重定位表,記錄 .text 中需修正的地址位置(如訪問 .data 符號的指令)。


符號已被替換為相對地址(如 je 23)。跳轉指令使用相對偏移,內存訪問指令地址為 0,待鏈接器修正。

EXEC,Entry point 為 0x8048074(_start 地址)。.bss、.rel.text)。.text 加載地址 0x8048074,.data 為 0x80490a0。符號表 Value 變為絕對地址,新增 __bss_start、_edata、_end 供加載器初始化 .bss。

.text + ELF Header + Program Header Table,加載至 0x08048000,權限 R X,文件大小 0x9e。.data,加載至 0x080490a0,權限 R W,文件大小 0x38。0x1000(4KB 頁),滿足 MMU 頁級權限保護。文件偏移與內存偏移保持一致(0xa0),簡化加載器實現。
跳轉指令:使用相對偏移(PC-relative),指令機器碼 無需修改,反匯編顯示的目標地址因基址改變而不同。
內存訪問指令:mov 0x0(,%edi,4), %eax 中的 32 位立即數地址從 0x00000000 修正為 0x080490a0(小端序 a0 90 04 08)。
鏈接器依據 .rel.text 重定位條目精確定位需修正處:
Offset 0x08, 0x17 → 對應兩條 mov 指令中的 00 00 00 00 位置 Type R_386_32 → 32 位絕對地址重定位 Sym.Value 0 → .data 段相對地址 Sym.Name .data → 目標段
