美文网首页ios底层原理
ios应用程序加载分析(一)

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

作者: erlich | 来源:发表于2022-07-05 22:04 被阅读0次

    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 是如何调用的,通过汇编查看 -

    • 寄存器查看 - 注意 控制台打印的 rbx寄存器的内容 (libObjc)
    image.png
    • 参数情况 (libDyld)
    image.png image.png
    • invoke (libSystem)
    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应用程序加载分析(二)]

    相关文章

      网友评论

        本文标题:ios应用程序加载分析(一)

        本文链接:https://www.haomeiwen.com/subject/qjqebrtx.html