ios应用程序加载分析(二)

13,863

为了不至于分析链条发生断层,请参阅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

Screen Shot 2022-04-17 at 4.25.57 PM.png

2.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(); 扫描若引用

image.png

修复selector

image.png

image.png

Fix up old objc_msgSend_fixup call sites

image.png

image.png

实现 (有实现+load方法)的类

image.png

load_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

类加载主干流程总结

image.png

_dyld_objc_notify_register 之前,执行 static_init()

也就是objc镜像内的 attribute((constructor)) 修饰的c++函数会先执行

load_images 执行之后 -> doModInitFunctions, 执行 目标镜像 attribute((constructor)) 修饰的c++函数