承接上篇理論,本文以實際 objdump 輸出圖片為證,逐幀拆解 a.o、b.o 鏈接為 ab 的完整地址變遷過程,視覺化呈現重定位魔法。
gcc -c a.c b.c # 生成 a.o, b.o gcc a.o b.o -o ab # 靜態鏈接生成 ab




a.o、b.o 的 .text、.data、.bss 起始地址均為 0x0shared、swap 在各自文件內的偏移可見
0x08048000.text 從 0x08048000 開始,.data 從 0x08049158 開始

0x11:R_386_32 類型,符號 shared(絕對地址修正)0x20:R_386_PC32 類型,符號 swap(相對地址修正)

0x11 處:c7 44 24 04 00 00 00 00 → movl $0x0, 0x4(%esp),shared 佔位 00x20 處:e8 fc ff ff ff → call 0x21,相對偏移 -4(swap 佔位)

0x80480a5:c7 44 24 04 58 91 04 08 → movl $0x8049158, 0x4(%esp),**shared 真實地址**0x80480b4:e8 07 00 00 00 → call 0x80480c0,**swap 真實入口**

shared 位於 .data 段起始 0x08049158swap 位於 .text 段內 0x080480c0| 項目 | 公式 | 數值 | 結果 |
|---|---|---|---|
| shared (R_386_32) | S + A | 0x08049158 + 0 | 0x08049158 → 小端 58 91 04 08 ✅ |
| swap (R_386_PC32) | S + A - P | 0x080480c0 + (-4) - 0x080480b5 | 0x7 → 小端 07 00 00 00 ✅ |
R_386_32 用於數據絕對地址,**直接填最終虛擬地址**R_386_PC32 用於 call/jmp 相對跳轉,**填相對偏移 (目標 - 下一條指令地址)**.rel.text、.rel.data 等重定位表中,鏈接器按表逐項處理這組圖證鏈,是理解「鏈接器如何把分散的 .o 縫合成連續內存映像」的最直觀教材。