app启动分析+猜测
首先通过入口函数main断点查看
nothing ... 通过load入口断点查看
得到大致的堆栈关键信息 (反向调用信息如下)
dyld - _dyld_start
dyld - dyldbootstrap::sart
dyld - dyld::_main
dyld - dyld::useSimulatorDyld
dyld_sim - start_sim
dyld_sim - dyld::_main
dyld_sim - dyld::initializeMainExecutable
dyld_sim - ImageLoader::runInitializers
dyld_sim - ImageLoader::processInitializers
dyld_sim - ImageLoader::recursiveInitialization
dyld_sim - dyld::notifySingle
libobjc - load_images
...... +(void)load
dyld - _dyld_start 开始追踪源码
源码量大,头晕,迷失,回到 dyld::_main 1000行的代码里继续分析
dyld::_main 返回result,尝试分析找result的赋值部分
MachOView俗称烂苹果打开 app可执行文件
发现Executable 关键字
结合上下文跟注释,sMainExecutable --- find entry point for main executable
找 sMainExecutable的赋值
下图参考MachOView查看对照一些符号相关的内容
link main executable
绑定若引用符号表
run all initializers 程序跑起来了
跟libobjc联系了起来
libdispatch search
至于libSystem_initializer 是如何调用的,通过汇编查看 -
- 寄存器查看 - 注意 控制台打印的 rbx寄存器的内容 (libObjc)
- 参数情况 (libDyld)
- invoke (libSystem)
结合之前的正向分析及堆栈反向递推,整个流程如下
上图一出错误修正 - recursiveInitialization 与 doInitialization 之间的序列线,请参阅
[ios应用程序加载分析(二)]里会有分析断层的补充说明
- 需要了解关键节点:
_dyld_start
(dyld) -> doModInitFunctions
(dyld) -> libSystem_initializer
(libSystem) -> libdispatch_init
(libdispatch) -> _objc_init
(libobjc) -> registerObjCNotifiers
(dyld) :::::: sNotifyObjCMapped = mapped; && sNotifyObjCInit = init; && sNotifyObjCUnmapped = unmapped;