動態(tài)鏈接庫加載的具體流程

動態(tài)鏈接庫加載的具體流程

動態(tài)鏈接庫的加載步驟具體分為5步:

  • load dylibs image 讀取庫鏡像文件
  • Rebase image
  • Bind image
  • Objc setup
  • initializers

load dylibs image

在每個動態(tài)庫的加載過程中德召, dyld需要:

分析所依賴的動態(tài)庫
找到動態(tài)庫的mach-o文件
打開文件
驗證文件
在系統(tǒng)核心注冊文件簽名
對動態(tài)庫的每一個segment調(diào)用mmap()
通常的,一個App需要加載100到400個dylibs, 但是其中的系統(tǒng)庫被優(yōu)化,可以很快的加載众羡。 針對這一步驟的優(yōu)化有:

減少非系統(tǒng)庫的依賴
合并非系統(tǒng)庫
使用靜態(tài)資源擒悬,比如把代碼加入主程序

rebase/bind

由于ASLR(address space layout randomization)的存在摊唇,可執(zhí)行文件和動態(tài)鏈接庫在虛擬內(nèi)存中的加載地址每次啟動都不固定左医,所以需要這2步來修復鏡像中的資源指針,來指向正確的地址特姐。 rebase修復的是指向當前鏡像內(nèi)部的資源指針晶丘; 而bind指向的是鏡像外部的資源指針。
rebase步驟先進行唐含,需要把鏡像讀入內(nèi)存浅浮,并以page為單位進行加密驗證,保證不會被篡改捷枯,所以這一步的瓶頸在IO滚秩。bind在其后進行,由于要查詢符號表淮捆,來指向跨鏡像的資源郁油,加上在rebase階段,鏡像已被讀入和加密驗證攀痊,所以這一步的瓶頸在于CPU計算桐腌。
通過命令行可以查看相關的資源指針:

xcrun dyldinfo -rebase -bind -lazy_bind myApp.App/myApp

優(yōu)化該階段的關鍵在于減少__DATA segment中的指針數(shù)量。我們可以優(yōu)化的點有:

減少Objc類數(shù)量苟径, 減少selector數(shù)量
減少C++虛函數(shù)數(shù)量
轉(zhuǎn)而使用swift stuct(其實本質(zhì)上就是為了減少符號的數(shù)量)
Objc setup
這一步主要工作是:

注冊Objc類 (class registration)

把category的定義插入方法列表 (category registration)
保證每一個selector唯一 (selctor uniquing)
由于之前2步驟的優(yōu)化案站,這一步實際上沒有什么可做的。

initializers

以上三步屬于靜態(tài)調(diào)整(fix-up)棘街,都是在修改__DATA segment中的內(nèi)容蟆盐,而這里則開始動態(tài)調(diào)整承边,開始在堆和堆棧中寫入內(nèi)容。 在這里的工作有:

Objc的+load()函數(shù)
C++的構(gòu)造函數(shù)屬性函數(shù) 形如attribute((constructor)) void DoSomeInitializationWork()
非基本類型的C++靜態(tài)全局變量的創(chuàng)建(通常是類或結(jié)構(gòu)體)(non-trivial initializer) 比如一個全局靜態(tài)結(jié)構(gòu)體的構(gòu)建舱禽,如果在構(gòu)造函數(shù)中有繁重的工作炒刁,那么會拖慢啟動速度

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末恩沽,一起剝皮案震驚了整個濱河市誊稚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌罗心,老刑警劉巖里伯,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異渤闷,居然都是意外死亡疾瓮,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門飒箭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狼电,“玉大人,你說我怎么就攤上這事弦蹂〖绲” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵凸椿,是天一觀的道長削祈。 經(jīng)常有香客問我,道長脑漫,這世上最難降的妖魔是什么髓抑? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮优幸,結(jié)果婚禮上吨拍,老公的妹妹穿的比我還像新娘。我一直安慰自己网杆,他們只是感情好羹饰,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著跛璧,像睡著了一般严里。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上追城,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天刹碾,我揣著相機與錄音,去河邊找鬼座柱。 笑死迷帜,一個胖子當著我的面吹牛物舒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播戏锹,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼冠胯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了锦针?” 一聲冷哼從身側(cè)響起荠察,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎奈搜,沒想到半個月后悉盆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡馋吗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年焕盟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宏粤。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡脚翘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绍哎,到底是詐尸還是另有隱情来农,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布蛇摸,位于F島的核電站备图,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏赶袄。R本人自食惡果不足惜揽涮,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望饿肺。 院中可真熱鬧蒋困,春花似錦、人聲如沸敬辣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽溉跃。三九已至村刨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間撰茎,已是汗流浹背嵌牺。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人逆粹。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓募疮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親僻弹。 傳聞我的和親對象是個殘疾皇子阿浓,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

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