iOS app 的生成 和 啟動過程,是否都用到了 鏈接器?
答:是的,iOS 應(yīng)用的生成和啟動過程都用到了鏈接器。
鏈接器:linker Editor(ld)
動態(tài)鏈接器:dynamic linker Editor(dyld)
1. 應(yīng)用生成階段
在生成 iOS 應(yīng)用時,鏈接器(通常是 ld)將編譯后的目標(biāo)文件(.o)和庫文件(.a 或 .dylib)合并,生成可執(zhí)行文件(Mach-O 文件)。主要步驟包括:
- 符號解析:確保所有符號引用都有定義。
- 地址分配:為代碼和數(shù)據(jù)分配內(nèi)存地址。
- 重定位:調(diào)整代碼和數(shù)據(jù)中的地址引用。
- 生成可執(zhí)行文件:輸出最終的 Mach-O 文件。

image.png
在鏈接多個目標(biāo)文件的過程中,會創(chuàng)建一個符號表,用于解析和重定位符號
符號表的作用:
符號解析:確保所有符號引用都能找到對應(yīng)的定義。
重定位:調(diào)整符號地址,使其在最終可執(zhí)行文件中正確指向內(nèi)存位置。
在鏈接多個目標(biāo)文件的過程中,會創(chuàng)建一個符號表,用于記錄:已定義的和未定義的符號。
- 報錯:“
ld: dumplicate symbols”的錯誤信息;原因:鏈接時如果出現(xiàn)相同的符號 - 報錯: “
Undefined symbols”;原因:在目標(biāo)文件里沒有找到符號
2. 應(yīng)用啟動階段
啟動時,動態(tài)鏈接器(dyld)負責(zé)加載和鏈接可執(zhí)行文件及其依賴的動態(tài)庫。主要步驟包括:
- 加載可執(zhí)行文件:將 Mach-O 文件加載到內(nèi)存。
- 加載依賴庫:遞歸加載所有依賴的動態(tài)庫。
- 符號解析與重定位:解析未定義的符號并調(diào)整地址引用。
- 初始化:執(zhí)行庫和可執(zhí)行文件的初始化代碼。
總結(jié)
生成階段:使用靜態(tài)鏈接器(ld)生成可執(zhí)行文件。
啟動階段:使用動態(tài)鏈接器(dyld)加載和鏈接可執(zhí)行文件及依賴庫。
兩者都涉及鏈接器,但職責(zé)不同。