dyld概述
dyld加载所有的库和可执行文件
dyld 加载流程
- 程序由_dyld_start函数开始
- 进入dyld::_main函数
- 配置一些环境变量(DYLD_PRINT_ENV:打印魂晶变量;DYLD_PRINT_OPTS:machO的地址)
- 加载共享缓存库:UIKit、Foundation(一开始就判断是否被禁用,iOS无法被禁用的)
- 加载实例化主程序
- 加载动态库
- 连接主程序
- 最关键的地方:初始化方法
- 经过过一系列的初始化调用notifySingle函数
- 该函数会执行一个回调
- 通过断点调试:进入_objc_init初始化
- 内部有map_images、load_images(内部调用load方法)
- doModinitFunctions函数
- 内部调用带__atrribute__((constuctor)) 的c函数
- 返回主程序的函数入口,调用主程序的main函数
- 经过过一系列的初始化调用notifySingle函数
atrribute((constuctor)) 函数例子
__atrribute__((constuctor)) void func1 {
printf("构造函数1");
}
方法的调用顺序
load --- c++构造函数 --- main
image加载顺序
mage加载顺序 共享缓存(UIKit、foundation ...) --- 动态插入的库 --- 三方库 --- 程序