現代主流採用動態連結/動態載入。理解底層機制對系統分析、即時系統時空效率把控至關重要。核心工具:gdb、objdump、readelf、ldd。
PT_INTERP 區段,獲取動態連結器名稱(現代 Linux 通常為 /lib/ld-linux.so.2).init 區段初始化代碼(現代用 __attribute__((constructor)))_start → main)| 維度 | 靜態連結 | 動態連結 |
|---|---|---|
| 外部符號解析 | 編譯連結階段完成 | 執行階段動態解析 |
| 執行檔大小 | 較大 (含所有庫代碼) | 較小 (僅符號引用) |
| 記憶體佔用 | 多程式重複載入相同代碼 | 共享庫單一實例多進程共享 |
| 庫更新影響 | 需重新編譯連結 | 無需重編譯,自動獲取更新 |
| 啟動速度 | 較快 (無動態解析開銷) | 略慢 (需動態連結器處理) |
.dynamic:動態連結資訊 (DT_NEEDED, DT_STRTAB, DT_SYMTAB 等).got / .got.plt:全域偏移表.plt:程序連結表 (支援 Lazy Binding).dynsym / .dynstr:動態符號表/字串表.rel.dyn / .rel.plt:重定位表首次呼叫外部函數時:
.plt 存根代碼.plt[0] (動態連結器入口).got.plt# 查看動態依賴
ldd /bin/ls
# 查看 ELF 區段
readelf -S /bin/ls
# 查看動態區段
readelf -d /bin/ls
# 查看符號表
nm -D /lib/libc.so.6
# 追蹤動態連結器行為
LD_DEBUG=libs ls
LD_BIND_NOW=1)prelink 預先重定位減少啟動開銷