7.DYLD

例:

在main函数中打上断点和viewController中手写+(void)load 方法,在应用启动的时候,是viewController 中的load先断到

bt 指令是查看函数调用栈的

up 指令在函数调用栈中往上走

可以看到 dyldbootstrap::start 函数

查看 DYLD 源码

全局搜索 dyldbootstrap  ,然后在 dyldbootstrap 中搜索start 函数,可以找到在468行,可以通过 command + shift + j 定位到这个文件


const struct macho_header* appsMachHeader, (参数是machO header,是和宏定义,64位就是64位的header)

int argc,

const char* argv[],  

intptr_t slide,(ASLR,随机值,machO加载到内存中是,随机加一个变量)

const struct macho_header* dyldsMachHeader,

uintptr_t* startGlue


配置环境变量

当我们配置了环境变量的值,可以看到打印信息,在load调用前就已经打印了环境变量的信息

配置DYLD_PRINT_OPTS 后可以看到打印的是machO 的地址

加载共享缓存

//检查共享缓存是否为禁用状态 但是最后一句话告诉我们iOS设备不能禁用共享缓存

主程序的实例化


sniffLoadCommands 实例化的是抽象类,需要其他子类实力化为machO 的image 

加载动态库

连接三方库

自己添加的库,会根据添加的顺序加载对应的库,+(void)load方法的调用顺序也是如此。

在这里进行weak 的绑定

run主程序




有个回调方法,sNotifyObjCInit

这个时候 (*sNotifyObjCInit)(image->getRealPath(), image->machHeader()); 就会调用objc 中的方法load_images

在 _dyld_objc_notify_register  方法中调用 registerObjCNotifiers

可以下一个符号断点来调试,可以发现在这个方法之前framework 的load 方法都还没有调用,所以之前的配置环境变量、加载共享缓存、实例化主程序、加载动态库、链接三方库 操作应该在 all Images 中。


可以通过寄存器查看 参数 


可以查看objc 源码,可以看到第二个参数就是 load_images

可以查找load_images 方法,(函数名称就是函数指针)

最后到 call_load_methods ,然后循环调用每一个类的loads

context.notifySingle(dyld_image_state_dependents_initialized, this, &timingInfo); 执行完成后所有framework的load方法都已经执行完毕了,然后开始加载image


doModInitFunctions 函数会执行 c++的构造函数 (module inti function ),framework代码注入都在这个构造函数之前

__attribute__((constructor))voidfunc3(){ printf("func3来了 \n"); } //固定写法

如果多个framework 中都有load 和 __attribute__ 构造方法,那么会根据添加的顺序,执行完每一个framework 的 load 和 __attribute__ 构造方法 才会执行下一个  framework 的  load 和 __attribute__ 构造方法 


可以通过machO view 看到, _mod_init_func 中有所有的构造函数

初始化函数执行完后,这时 main 函数还没有执行

result = (uintptr_t)sMainExecutable->getEntryFromLC_MAIN();  这时才开始调用main 函数,最终将result 返回


load  ->   构造函数 - > main 

image 的加载过程 :加载共享缓存 ->  加载插入的库  -> 加载三方库  -> 加载主程序


DYLD:

- dyld加载所有的库和可执行文件

- dyld加载流程

     - 程序执行从_dyld_start 开始

     - 进入 dyld:main 函数

          - 配置一些环境变量

          - 加载共享缓存库,一开始就判断是否禁用,iOS无法被禁用

          -  实例化主程序

          - 加载动态库 

         - 链接主程序

         - 最关键的地方:初始化方法

                 - 经过一些列初始化到 调用 notifySingle 函数

                        - 该函数会执行一个回调

                        - 通过断点调试:该回调是 _objc_init初始化的时候赋值的一个函数load_Images

                              - load_images 里面执行的是 call_load_methods函数

                                    - call_load_methods 函数循环调用各个类的load方法

                -  doModInitFunctions 函数

                             - 内部会调用带 __attribute__((constructor)) 的c函数

                -  返回主程序的入口函数,开始进入主程序的main函数

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351

推荐阅读更多精彩内容