美文网首页
iOS-底层(11):dyld加载流程

iOS-底层(11):dyld加载流程

作者: 恍然如梦_b700 | 来源:发表于2020-09-30 18:39 被阅读0次

    +load方法、c++函数、main函数的调用顺序

    image.png

    从打印顺序我们可以看到:
    ** +load方法 -> c++函数 -> main函数 **
    main函数是程序的入口,但它并不是最先执行的,why?
    我先来介绍一下app启动被隐藏的过程,这部分我推荐大家看一下《程序员的自我修养》

    编译期

    1. 源文件,<
    2. 预编译,进行词法分析、语法分析、语义分析,替换宏,删除注释,展开头文件,产生.i文件
    3. 编译,将.i文件转换为汇编语言,产生.s文件
    4. 汇编,将代码生成汇编代码 .s
    5. 目标文件,讲汇编转换为机器码文件也就是我们经常看到的.o文件
    6. 链接,静态链接器会将目标文件链接生成最终可执行文件

    3。

    main函数之前,都是有dyld动态链接器去负责的

    1. 调用dyld start 函数

      1. 读取macho文件信息,设置虚拟地址偏移量,也就是ASLR,用于重定向
      2. 调用dyldmain方法
    2. 配置环境变量,比如一些打印等信息

    3. 检查共享缓存,map共享缓存

    4. 主程序初始化,实例化出一个imageLoader对象

    5. 插入动态库,

    6. 链接动态库,

    7. 弱符号的绑定

    8. 执行初始化方法 libSystem_initializer(libSystem.B.dylib) --> _os_object_init(libdispatch.dylib) --> _objc_init(libobjc.A.dylib)

    9. 寻找主程序入口即main函数

    10. 执行初始化方法 会调用nitifiSingle方法 objc_init 方法里 loadImage方法

    相关文章

      网友评论

          本文标题:iOS-底层(11):dyld加载流程

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