《iOS底層原理文章匯總》
上一篇文章介紹了iOS-逆向12-MachO文件,本文介紹Dyld鏈接器如何加載MachO文件,dyld的加載流程怎披,可參考前面的文章iOS-底層原理12-應(yīng)用程序加載
dyld:動(dòng)態(tài)鏈接器:加載所有的庫(kù)和可執(zhí)行文件
dyld加載流程:
- 程序執(zhí)行從_dyld_start開(kāi)始->dyld`dyldbootstrap::start
- 進(jìn)入dyld main函數(shù)
- 配置一些環(huán)境: rebase_dyld
- 加載共享緩存
dyld2/dyld3(閉包模式)
- 實(shí)例化主程序
- 加載動(dòng)態(tài)庫(kù)(首先是插入的動(dòng)態(tài)庫(kù)(項(xiàng)目運(yùn)用到的第三方庫(kù)),系統(tǒng)庫(kù)等)澎嚣,dyldinsertLibrary,無(wú)論是主程序還是動(dòng)態(tài)庫(kù)都會(huì)添加進(jìn)allImage中榆鼠,loadAllImages)
- 鏈接主程序,綁定符號(hào)表(非懶加載亥鸠,弱符號(hào))等等
- 最關(guān)鍵的初始化方法initializeMainExecutable
- dyld`ImageLoader:runInitializers
- dyld`ImageLoader::processInitializers
- dyld`ImageLoader::recursiveInitialization
- dyld`context.notifySingle
- 此函數(shù)執(zhí)行一個(gè)回調(diào)
- 通過(guò)斷點(diǎn)調(diào)試:此回調(diào)是_objc_init()初始化時(shí)賦值的一個(gè)函數(shù)load_images
3.load_images里面執(zhí)行call_load_methods函數(shù)
4.call_class_loads函數(shù)妆够,會(huì)循環(huán)調(diào)用各個(gè)類(lèi)的load方法
- dyld`ImageLoaderMachO::doModInitFunctions:
1.函數(shù)內(nèi)部會(huì)調(diào)用全局C++對(duì)象的構(gòu)造函數(shù)attribute((constructor))的C函數(shù)- 返回主程序的入口函數(shù),進(jìn)入主程序的main函數(shù)
思考:給主程序添加load方法负蚊,是主程序中的load先執(zhí)行神妹,還是frameworks中的load先執(zhí)行?與imagelist順序有關(guān)家妆,是正序加載還是倒序加載呢鸵荠?
在主程序的AppDelegate,ViewController類(lèi)中中和動(dòng)態(tài)庫(kù)的CloudHook中類(lèi)Inject的load方法中分別斷點(diǎn)調(diào)試伤极,發(fā)現(xiàn)會(huì)先走動(dòng)態(tài)庫(kù)CloudHook中的類(lèi)Inject中的load方法
主程序中類(lèi)的load方法順序會(huì)依據(jù)Build Phases中的Compile sources中的文件順序