iOS應用程序加載

  1. 在main()函數(shù)之前,在一般情況下,我們都會將main()函數(shù)作為程序入口,在main函數(shù)之前,程序所經(jīng)歷的事情


    image.png
  • 靜態(tài)庫:鏈接時會被完整的復制到可執(zhí)行文件中,所以如果兩個程序都用了某個靜態(tài)庫,那么每個二進制文件中,都會包含這個靜態(tài)庫文件
  • 動態(tài)庫:鏈接時不復制,在程序啟動后用動態(tài)加載,然后再決議符號,所以理論上動態(tài)庫只用存在一份,好多個程序都可以鏈接到這個動態(tài)庫上面,達到節(jié)省內存作用,還有另一個好處,由于動態(tài)庫并不綁定到可執(zhí)行程序上,所以我們想升級這個動態(tài)庫就很容易

動態(tài)鏈接庫

  • iOS中用到的所有系統(tǒng)framework
  • 加載OC runtime方法libobjc
  • 系統(tǒng)級別的libSystem,例如libdispatch(GCD)和libSystem_blocks(Block)
    這些放在內存中的共享庫文件會在app啟動后交給dyld動態(tài)鏈接器來進行鏈接管理,鏈接流程如下:


    image.png

main()函數(shù)之前

  • 首先加載load函數(shù)
  • 加載dyld,dyld_start來實現(xiàn)加載
  • main()函數(shù):加載共享系統(tǒng)動態(tài)庫,加載依賴的動態(tài)庫,鏈接動態(tài)庫,初始化主程序,返回主程序main()函數(shù)地址
  • 加載共享緩存
  • 生成ImageLoader對象
  • 加載所有插入的庫loadInsertDylib
  • 鏈接主程序
  • 執(zhí)行初始化方法initializeMainExecutable

dyld加載順序

    1. __dyld_start(匯編)
    1. uintptr_t start()
    1. uintptr_t _main()
  • 3.1.配置上下文
  • 3.2.處理環(huán)境變量
  • 3.3.加載共享緩存
  • 3.4.將dyld加入UUID列表
  • 3.5.加載所有image
    3.5.1.為可執(zhí)行文件實例化imageLoader
    3.5.2.為主可執(zhí)行文件創(chuàng)建image
    3.5.3.加載任何插入動態(tài)庫
    3.5.4.鏈接動態(tài)庫
  • 3.6 初始化所有程序
    3.6.1.遍歷初始化image
    3.6.2.通知image初始化完成
    3.6.3初始化libSystem
    3.6.4.初始化libdispatch
    3.6.5.初始化libobjc
  • 3.7進入主程序main函數(shù)
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 1. 理論基礎速成 1.1 靜態(tài)庫與動態(tài)庫 庫是已寫好的、供使用的 可復用代碼,每個程序都要依賴很多基礎的底層庫。...
    賣饃工程師閱讀 825評論 0 5
  • 前言 我們都知道,每個項目都會有一個入口 main() 函數(shù),是不是應用程序加載時第一個調用的就是 main 函數(shù)...
    遠方竹葉閱讀 723評論 0 6
  • 調用在main()之前 一般開發(fā)場景中,我們都是把main()函數(shù)作為程序的入口,但是這里探究一下man()函數(shù)開...
    FireStroy閱讀 1,092評論 2 4
  • 本文的目的主要是分析dyld的加載流程 首先我們先運行個代碼 來引入我們今天的主題~~ 運行結果: 運行程序,查看...
    北京_小海閱讀 701評論 1 3
  • 前言 今天我們重點來分析一下,iOS App運行時,在main()方法執(zhí)行之前,程序到底做了哪些事? 準備工作 示...
    深圳_你要的昵稱閱讀 563評論 2 4

友情鏈接更多精彩內容