iOS 鏈接器

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é)不同。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容