ios底层原理

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

2022-07-05  本文已影响0人  erlich

app启动分析+猜测

首先通过入口函数main断点查看

image.png image.png

nothing ... 通过load入口断点查看

image.png

得到大致的堆栈关键信息 (反向调用信息如下)

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 开始追踪源码

image.png image.png image.png image.png image.png image.png image.png image.png

源码量大,头晕,迷失,回到 dyld::_main 1000行的代码里继续分析

dyld::_main 返回result,尝试分析找result的赋值部分
image.png
MachOView俗称烂苹果打开 app可执行文件
image.png
发现Executable 关键字

结合上下文跟注释,sMainExecutable --- find entry point for main executable
找 sMainExecutable的赋值
image.png image.png image.png
下图参考MachOView查看对照一些符号相关的内容
image.png image.png
link main executable
image.png
绑定若引用符号表
image.png
run all initializers 程序跑起来了
image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png

跟libobjc联系了起来

image.png image.png image.png
libdispatch search
image.png image.png image.png image.png image.png

至于libSystem_initializer 是如何调用的,通过汇编查看 -

image.png image.png image.png image.png

结合之前的正向分析及堆栈反向递推,整个流程如下

image.png

上图一出错误修正 - 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;

image.png image.png

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

上一篇下一篇

猜你喜欢

热点阅读