dyld加載流程

dyld加載流程

配置環(huán)境變量依賴DYLD(dyld)
dyld(the dynamic link editor)是蘋果的動(dòng)態(tài)鏈接器翁授,是蘋果操作系統(tǒng)的重要組成部分糊治,在app被編譯打包成可執(zhí)行文件格式的Mach-O文件后轻庆,交由dyld負(fù)責(zé)連接阵谚,加載程序

image.jpeg


app啟動(dòng)的起始點(diǎn)

image.jpeg


【app啟動(dòng)起點(diǎn)】:通過程序運(yùn)行發(fā)現(xiàn),是從dyld中的_dyld_start開始的乌妙,

image.jpeg

源碼中搜索dyldbootstrap找到命名作用空間森书,再在這個(gè)文件中查找start方法靶端,其核心是返回值的調(diào)用了dyld的main函數(shù)

在_main函數(shù)中主要做了一下幾件事情:
【第一步:環(huán)境變量配置】:根據(jù)環(huán)境變量設(shè)置相應(yīng)的值以及獲取當(dāng)前運(yùn)行架構(gòu)
【第二步:共享緩存】:檢查是否開啟了共享緩存,以及共享緩存是否映射到共享區(qū)域凛膏,例如UIKit杨名、CoreFoundation等
【第三步:主程序的初始化】:調(diào)用instantiateFromLoadedImage函數(shù)實(shí)例化了一個(gè)ImageLoader對象
【第四步:插入動(dòng)態(tài)庫】:遍歷DYLD_INSERT_LIBRARIES環(huán)境變量,調(diào)用loadInsertedDylib加載
【第五步:link 主程序】
【第六步:link 動(dòng)態(tài)庫】
【第七步:弱符號(hào)綁定】
【第八步:執(zhí)行初始化方法】
【第九步:尋找主程序入口即main函數(shù)】:從Load Command讀取LC_MAIN入口猖毫,如果沒有台谍,就讀取LC_UNIXTHREAD,這樣就來到了日常開發(fā)中熟悉的main函數(shù)了
第三步:主程序初始化
sMainExecutable表示主程序變量鄙麦,查看其賦值典唇,是通過instantiateFromLoadedImage方法初始化

image.jpeg

進(jìn)入instantiateFromLoadedImage源碼,其中創(chuàng)建一個(gè)ImageLoader實(shí)例對象胯府,通過instantiateMainExecutable方法創(chuàng)建


image.jpeg

進(jìn)入instantiateMainExecutable源碼介衔,其作用是為主可執(zhí)行文件創(chuàng)建映像,返回一個(gè)ImageLoader類型的image對象骂因,即主程序炎咖。其中sniffLoadCommands函數(shù)時(shí)獲取Mach-O類型文件的Load Command的相關(guān)信息,并對其進(jìn)行各種校驗(yàn)


image.jpeg

上面的第八步:執(zhí)行初始化方法
進(jìn)入initializeMainExecutable源碼,主要是循環(huán)遍歷寒波,都會(huì)執(zhí)行runInitializers方法

image.jpeg

notifySingle 函數(shù)
發(fā)現(xiàn)在_dyld_objc_notify_register進(jìn)行了調(diào)用
_dyld_objc_notify_register乘盼,發(fā)現(xiàn)在_objc_init源碼中調(diào)用了該方法,并傳入了參數(shù)俄烁,所以sNotifyObjCInit的賦值的就是objc中的load_images绸栅,而load_images會(huì)調(diào)用所有的+load方法。所以綜上所述页屠,notifySingle是一個(gè)回調(diào)函數(shù)

image.jpeg

load函數(shù)加載
下面我們進(jìn)入load_images的源碼看看其實(shí)現(xiàn)粹胯,以此來證明load_images中調(diào)用了所有的load函數(shù)

通過objc源碼中_objc_init源碼實(shí)現(xiàn),進(jìn)入load_images的源碼實(shí)現(xiàn)


image.jpeg

進(jìn)入call_load_methods源碼實(shí)現(xiàn)辰企,可以發(fā)現(xiàn)其核心是通過do-while循環(huán)調(diào)用+load方法


image.jpeg

【總結(jié)】load的源碼鏈為:_dyld_start --> dyldbootstrap::start --> dyld::_main --> dyld::initializeMainExecutable --> ImageLoader::runInitializers --> ImageLoader::processInitializers --> ImageLoader::recursiveInitialization --> dyld::notifySingle(是一個(gè)回調(diào)處理) --> sNotifyObjCInit --> load_images(libobjc.A.dylib)

image.jpeg

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末风纠,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子牢贸,更是在濱河造成了極大的恐慌竹观,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異臭增,居然都是意外死亡懂酱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門速址,熙熙樓的掌柜王于貴愁眉苦臉地迎上來玩焰,“玉大人由驹,你說我怎么就攤上這事芍锚。” “怎么了蔓榄?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵并炮,是天一觀的道長。 經(jīng)常有香客問我甥郑,道長逃魄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任澜搅,我火速辦了婚禮伍俘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘勉躺。我一直安慰自己癌瘾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布饵溅。 她就那樣靜靜地躺著妨退,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蜕企。 梳的紋絲不亂的頭發(fā)上咬荷,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音轻掩,去河邊找鬼幸乒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛唇牧,可吹牛的內(nèi)容都是我干的罕扎。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼奋构,長吁一口氣:“原來是場噩夢啊……” “哼壳影!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起弥臼,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對情侶失蹤宴咧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后径缅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掺栅,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡烙肺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了氧卧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片桃笙。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖沙绝,靈堂內(nèi)的尸體忽然破棺而出搏明,到底是詐尸還是另有隱情,我是刑警寧澤闪檬,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布星著,位于F島的核電站,受9級(jí)特大地震影響粗悯,放射性物質(zhì)發(fā)生泄漏虚循。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一样傍、第九天 我趴在偏房一處隱蔽的房頂上張望横缔。 院中可真熱鬧,春花似錦衫哥、人聲如沸茎刚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽斗蒋。三九已至,卻和暖如春笛质,著一層夾襖步出監(jiān)牢的瞬間泉沾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國打工妇押, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留跷究,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓敲霍,卻偏偏與公主長得像俊马,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子肩杈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容