Mach-O学习笔记

2019-08-05  本文已影响0人  Archerlly

Mach-O文件结构

image.png

App启动流程

  1. 将Mach-O中Segment与符号表等数据映射到内存中
  2. 调用dyld(the dynamic link editor)程序,动态链接器
  3. 加载UUID与构建二进制是的的源码版本等信息
  4. 设置程序主线程的main函数入口地址和栈大小
  5. 设置依赖的动态库
  6. 加载代码开始地址、代码段内的非指令的表、代码签名
  7. 系统kernel做好启动程序的初始准备后,动态链接依赖库,并由runtime负责加载成objc定义的结构,所有初始化工作结束后,dyld调用真正的main函数
    1. 从kernel留下的原始调用栈引导和启动自己

    2. 将程序依赖的动态链接库递归加载进内存,系统有缓存机制

      1. 交由imageLoader读取image,其中包含了我们的类,方法等各种符号
      2. 由于runtime向dyld绑定了回调,当image加载到内存后,dyld会通知runtime进行处理
      3. runtime接手后调用map_images做解析和处理,接下来load_images中调用call_load_methods方法,遍历所有加载进来的Class,按继承层级依次调用Class的+load方法和Category的+load方法
    3. non-lazy符号立即link到可执行文件,lazy的存表里

    4. 找到可执行文件的main函数,准备参数并调用

    5. 程序执行中负责绑定lazy符号、提供runtime dynamic loading services、提供调试器接口。

    6. 程序main函数return后执行static terminator

    7. 某些场景下main函数结束后调libSystem的_exit函数。

参考

上一篇 下一篇

猜你喜欢

热点阅读