簡述
人們的生活方式已經(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í)行的文件)
那么動(dòng)態(tài)庫在程序中是怎么加載到內(nèi)存呢呆细?系統(tǒng)是通過怎樣的方式來鏈接的呢?這就用到了一個(gè)工具八匠,那就是動(dòng)態(tài)鏈接器絮爷!
動(dòng)態(tài)鏈接器
以上為加載工作流程圖适袜,動(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ù)上缆娃,發(fā)現(xiàn)在main
之前還調(diào)用了一個(gè)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源碼
我們研究源碼笤休,就得去看最新的蘋果源碼,畢竟技術(shù)更新迭代很快症副,最新的才是最流行的店雅,也是最香的,研究起來才有味道贞铣,
dyld
最新的版本是dyld-852闹啦,這部分源碼是不能編譯的,但是并不能妨礙我們?nèi)ヌ剿魉印D敲次覀儸F(xiàn)在就去打開dyld
這個(gè)牛逼的源碼工程一探究竟吧窍奋!
3.3 初探dyld 源碼
全局搜索
_dyld_start,
發(fā)現(xiàn)又是匯編酱畅,是不是要瘋了傲瞻馈!
莫慌靚仔纺酸,穩(wěn)住窖逗,不會(huì)匯編沒有關(guān)系,請(qǐng)耐心往下看餐蔬!
在匯編里面發(fā)現(xiàn)了一個(gè)重要方法碎紊,
dyldbootstrap::start
,從紅框中的注釋可以知道樊诺,會(huì)調(diào)用dyldbootstrap::start
這個(gè)C++
函數(shù)仗考,那么就可以去全局搜索下,看看C++
函數(shù)的命名空間啄骇。
從命名空間里面痴鳄,我們可以找到
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