ios应用程序加载分析(二)
2022-07-05 本文已影响0人
erlich
为了不至于分析链条发生断层,请参阅
ios应用程序加载分析(一)
_dyld_objc_notify_register ---- sNotifyObjcInit 是如何关联上的
sNotifyObjcInit 分析源头
image.png image.png image.png image.png image.png image.png以上源码出自于dyld
image.png
上一段源码出自于libobjc, libdyld与libobjc通过_dyld_objc_notify_register架起桥梁
回到加载流程图
image.png
image.png
image.png
image.png
image.png
与 libSystem_initializer 衔接上,此时缺口补上
map_images()镜像文件类的信息 class ro rw protocols 处理
根据以上分析得到句柄出处 sNotifyObjcInit
image.png
image.png
image.png
image.png
arr_init()
-
SideTablesMap.init(); 初始化散列表
-
_objc_associations_init(); 关联对象管理 初始化
-
startWeakTableScan(); 扫描若引用
修复selector
image.png image.pngFix up old objc_msgSend_fixup call sites
image.png image.png实现 (有实现+load方法)的类
image.pngload_images() load方法 - c++函数 + load + main
+load
image.png
image.png
image.png
image.png
c++
image.png
image.png
image.png
镜像内的 c++方法 晚于 +load执行,objc镜像内的 c++方法 早于 +load执行 最后main
类加载主干流程总结
image.png_dyld_objc_notify_register 之前,执行 static_init()
也就是objc镜像内的 attribute((constructor)) 修饰的c++函数会先执行
load_images 执行之后 -> doModInitFunctions, 执行 目标镜像 attribute((constructor)) 修饰的c++函数