上一篇文章介绍了加载我们程序の前所做的准备工作也就是环境配置,加载共享缓存MachO初始化,插入动态库加载等部分接下来就需要对我们主程序的加载做出分析了。
从这个函数开始我们可以从DYLD中很容易找到接下来的函数调用顺序,也就是函数调用栈中的执行顺序
当执行到 notifySingle 函数的时候,我们怎么樣也找不到一个叫做 load_images 的函数了……
但是分析整个函数我们找到一个可疑的代码:
一、需要执行上面那一句,从 if 可以判定需要 sNotifyObjCInit 不为空。
②、sNotifyObjCInit 是怎么来的谁给他赋值形成的非空。
最后只能断定是别的地方调用了,因为这里是一个回调函数
1、打开Xcode,给函数 _dyld_objc_notify_register 下一个符号断點因为这样可以看到函数调用栈。很清晰可以看到这个函数的调用来自objc_init,很明显是OC对象中调用的
2、此时为了找到具体调用流程,我們打开第二份开源代码objc的源码。
函数中有一个函数指针load_images,这就找到了
寻找load方法的调用
回到我们的程序 main
到此,我们DYLD整个加载流程完成叻
总结,DYLD的加载过程:
配置环境——加载共享缓存——初始化MechO——加载插入动态库——初始化主程序——objc_init给DYLD一个回调——load_images——load
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理
2.该文檔所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值立即自动返金币,充值渠道很便利
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。