dyld_shared_cache
iOS 3.1 开始将所有的系统库编译成一个大的缓存文件 dyld_share_cache
位于 /System/Library/Caches/com.apple.dyld/
dyld
源码:https://opensource.apple.com/tarballs/dyld/
1. _dyld_start
dyldbootstrap::start
dyld::_main
2. 加载环境变量 checkEnvironmentVariables
3. 加载共享缓存 checkShareRegionDisable mapSharedCache
4. 加载完成后将dyld本身添加到UUID列表里
5. 加载镜像Image
.1 通过ImageLoader加载image
.2 通过loadInsertedDylib将动态库读取成镜像文件image
.3 遍历所有的镜像文件,将镜像文件链接到二进制文件中
.4 开始initializeMainExecutable初始化程序
.5 遍历ImageLoade,进行runInitializers初始化操作
.6 在processInitializers函数里遍历ImageLoader里的每个image进行rescursiveInitialization初始化
.7 image初始化中最终会走到_object_init函数里面将相应的镜像文件的函数指针注册到对应dyld的通知中去
APP启动 --> 加载 libSystem --> Runtime向注册回调函数 -->加载image -> 执行map_iamges/Load_images --> main()
DYLD_PRINT_OPTS
DYLD_PRINT_ENV
setContext(mainExecutableMH, argc, argv, envp, apple);
__DATA.__nl_symbol_ptr 非懒加载符号表
__DATA.__la_symbol_ptr 懒加载符号表 由dyld_stub_binder 来绑定
iOS 13系统中,全面采用dyld 3
dyld会使用共享缓存 /var/db/dyld/ ;
查看Xcode编译时间
defaults write com.apple.dt.Xcode ShowBuildOperationDuration YES
ref
https://juejin.cn/post/6844903973095211015 iOS进阶之路 (八)dyld加载流程
https://juejin.cn/post/6844903798586998797
https://www.jianshu.com/p/96f66b0c943c WWDC 2017
https://juejin.cn/post/6844904116158726151#heading-22
https://juejin.cn/post/6844904068867948552#heading-20 iOS探索 浅尝辄止dyld加载流程