2021-07-17

簡述

人們的生活方式已經(jīng)發(fā)生了很大的變化,這是因?yàn)榛ヂ?lián)網(wǎng)的在近些年發(fā)展的非常迅速。

互聯(lián)網(wǎng)在未來很多年都是一個(gè)熱門的發(fā)展項(xiàng)目强挫,但是這個(gè)行業(yè)的競爭力也非常大岔霸,需要不斷的創(chuàng)新。但是學(xué)習(xí)總有一個(gè)流程與方案#

dyld的分析:

程序的加載原理圖——(代碼編寫完成俯渤,必須通過編譯器編譯才能變成可以執(zhí)行的文件)

image

那么動(dòng)態(tài)庫在程序中是怎么加載到內(nèi)存呢呆细?系統(tǒng)是通過怎樣的方式來鏈接的呢?這就用到了一個(gè)工具八匠,那就是動(dòng)態(tài)鏈接器絮爷!

動(dòng)態(tài)鏈接器


6a1d1af5f1284797b2c3b7750435cad0_tplv-k3u1fbpfcp-zoom-1.png

以上為加載工作流程圖适袜,動(dòng)態(tài)庫的注冊(cè)過程

分析底層源碼——dyld入口

這個(gè)嘛荐操,就得探索探索了!首先建一個(gè)工程將main.m改寫如下:

__attribute__((constructor)) void JPFunc(){
     printf("來了老弟 : %s \n",__func__);
}

int main(int argc, char * argv[]) {
    NSString * appDelegateClassName;
    @autoreleasepool {
        NSLog(@"這是main函數(shù)打印");
        // Setup code that might create autoreleased objects goes here.
        appDelegateClassName = NSStringFromClass([AppDelegate class]);
    }
    return UIApplicationMain(argc, argv, nil, appDelegateClassName);
}
復(fù)制代碼

然后運(yùn)行程序赤赊,打印結(jié)果如下:

來了老弟 : JPFunc 
dyld初探[37212:516752] 這是main函數(shù)打印
復(fù)制代碼

這個(gè)__attribute__((constructor))是在main函數(shù)之前執(zhí)行的一個(gè)函數(shù)劝萤。

  • 補(bǔ)充:GNU C 的一大特色就是__attribute__ 機(jī)制渊涝。__attribute__ 可以設(shè)置函數(shù)屬性(Function Attribute )、變量屬性(Variable Attribute )和類型屬性(Type Attribute )床嫌。

  • __attribute__ 書寫特征是:__attribute__ 前后都有兩個(gè)下劃線跨释,并切后面會(huì)緊跟一對(duì)原括弧,括弧里面是相應(yīng)的__attribute__ 參數(shù)厌处。

  • __attribute__ 語法格式為:__attribute__ ((attribute-list))

main函數(shù)執(zhí)行之前確實(shí)是可以執(zhí)行其他函數(shù)的鳖谈,那么dyld到現(xiàn)在好像還沒有相關(guān)線索,那么繼續(xù)往下探索阔涉。 在main函數(shù)打上斷點(diǎn)

斷點(diǎn)斷在main函數(shù)上

斷點(diǎn)斷在main函數(shù)上缆娃,發(fā)現(xiàn)在main之前還調(diào)用了一個(gè)start方法。

libdyld.dylib`start

點(diǎn)開start是一個(gè)libdyld.dylib start瑰排,突然想起網(wǎng)絡(luò)上很流行的一句話贯要,歡迎來到德萊聯(lián)盟libdyld.dylib和這發(fā)音好像椭住,哈哈崇渗!

但是通過對(duì)start下符號(hào)斷點(diǎn),斷不住它京郑。說明這不是入口的地方宅广,我們知道還有一個(gè)方法+load,這個(gè)是在main之前必會(huì)調(diào)用的方法些举,那么就可以在Viewcontroller的寫下+load方法添加斷點(diǎn)跟狱,運(yùn)行程序。在控制臺(tái)輸入指令bt金拒,查看調(diào)用堆棧信息:

堆棧信息

堆棧信息是一個(gè)棧結(jié)構(gòu)兽肤,先進(jìn)后出套腹,所以最底下打印的就是最先執(zhí)行的绪抛。所以現(xiàn)在我們已經(jīng)找到dyld的入口了资铡。

3.2 獲取dyld源碼

_dyld_start,那么這就涉及到底層源碼了幢码,去蘋果開放的源碼官網(wǎng)opensource看看dyld源碼

dyld源碼

我們研究源碼笤休,就得去看最新的蘋果源碼,畢竟技術(shù)更新迭代很快症副,最新的才是最流行的店雅,也是最香的,研究起來才有味道贞铣,dyld最新的版本是dyld-852闹啦,這部分源碼是不能編譯的,但是并不能妨礙我們?nèi)ヌ剿魉印D敲次覀儸F(xiàn)在就去打開dyld這個(gè)牛逼的源碼工程一探究竟吧窍奋!

3.3 初探dyld 源碼

_dyld_start源碼

全局搜索_dyld_start,發(fā)現(xiàn)又是匯編酱畅,是不是要瘋了傲瞻馈!

莫慌靚仔纺酸,穩(wěn)住窖逗,不會(huì)匯編沒有關(guān)系,請(qǐng)耐心往下看餐蔬!

dyldbootstrap::start

在匯編里面發(fā)現(xiàn)了一個(gè)重要方法碎紊,dyldbootstrap::start,從紅框中的注釋可以知道樊诺,會(huì)調(diào)用dyldbootstrap::start這個(gè)C++函數(shù)仗考,那么就可以去全局搜索下,看看C++函數(shù)的命名空間啄骇。

namespace dyldbootstrap

從命名空間里面痴鳄,我們可以找到start

在這里插入圖片描述

鏈接:https://juejin.cn/post/6984338883815145502
來源:掘金
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)缸夹,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處痪寻。

【騰訊文檔】更多資料分享
https://docs.qq.com/doc/DZXpKSU5LdEdja0hR

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市虽惭,隨后出現(xiàn)的幾起案子橡类,更是在濱河造成了極大的恐慌,老刑警劉巖芽唇,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件顾画,死亡現(xiàn)場離奇詭異取劫,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)研侣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門谱邪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人庶诡,你說我怎么就攤上這事惦银。” “怎么了末誓?”我有些...
    開封第一講書人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵扯俱,是天一觀的道長。 經(jīng)常有香客問我喇澡,道長迅栅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任晴玖,我火速辦了婚禮读存,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘窜醉。我一直安慰自己宪萄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開白布榨惰。 她就那樣靜靜地躺著拜英,像睡著了一般。 火紅的嫁衣襯著肌膚如雪琅催。 梳的紋絲不亂的頭發(fā)上居凶,一...
    開封第一講書人閱讀 51,245評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音藤抡,去河邊找鬼侠碧。 笑死,一個(gè)胖子當(dāng)著我的面吹牛缠黍,可吹牛的內(nèi)容都是我干的弄兜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼瓷式,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼替饿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起贸典,我...
    開封第一講書人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤视卢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后廊驼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體据过,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惋砂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绳锅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片西饵。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖榨呆,靈堂內(nèi)的尸體忽然破棺而出罗标,到底是詐尸還是另有隱情庸队,我是刑警寧澤积蜻,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站彻消,受9級(jí)特大地震影響竿拆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜宾尚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一丙笋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧煌贴,春花似錦御板、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至淹朋,卻和暖如春笙各,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背础芍。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來泰國打工杈抢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人仑性。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓惶楼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親诊杆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子歼捐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

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

  • dyld加載流程圖 建議大家在閱讀文章的時(shí)候,結(jié)合流程圖閱讀刽辙。這樣方便理解這個(gè)流程窥岩,可以將圖片下載到本地,一邊閱讀...
    Jax_YD閱讀 1,039評(píng)論 2 9
  • 1. 前言 現(xiàn)在的互聯(lián)網(wǎng)行業(yè)宰缤,是一天比一天卷颂翼,除了底層是必考點(diǎn)了晃洒,還有關(guān)于APP的性能優(yōu)化也是面試常問的點(diǎn)。 在優(yōu)...
    俊而不遜閱讀 322評(píng)論 0 0
  • 一朦乏、應(yīng)用程序加載原理 在分析dyld加載應(yīng)用程序之前球及,先清楚以下基本概念。庫:可執(zhí)行的二進(jìn)制文件呻疹,可以被系統(tǒng)加載到...
    HotPotCat閱讀 1,090評(píng)論 3 8
  • 一吃引、dyld概述 dyld(the dynamic link editor)動(dòng)態(tài)鏈接器,是蘋果操作系統(tǒng)一個(gè)重要組成...
    HotPotCat閱讀 567評(píng)論 0 3
  • 前言 之前刽锤,我們研究了很多關(guān)于iOS底層相對(duì)零碎的知識(shí)镊尺。而iOS對(duì)用戶來說,最重要的就是每一個(gè)APP并思。今天庐氮,我們來...
    iOS小木偶閱讀 785評(píng)論 1 2