Mach-O学习笔记

Mach-O文件结构

image.png
  • Header部分:描述文件基本信息(如CPU、架构、文件类型、加载命令个数)
  • loadCommands部分:描述各个Data部分的内存分布,对系统内核加载器和动态连接器起指导作用
  • Data部分:存放代码与数据

    • __PAGEZERO段:空指针陷阱段,映射到虚拟内存空间的第一页,用于捕捉对NULL指针的引用
    • __TEXT 段: 包含了执行代码以及其他只读数据的,当这个段被映射到内存后,可以被所有进程共享。(这主要用在frameworks, bundles和共享库等程序中,也可以为同一个可执行文件的多个进程拷贝使用)
    section 描述
    __text 代码实现
    __stubs 符号桩,本质上就是段会直接跳入到lazybinding的表的对应项指针指向的地址的代码
    __stubs_helper 辅助函数,上述lazybinding表中没有找到符号地址都指向这
    __cstring C string字符串常量
    __ustring Unicode string中文常量
    __objc_methname OC方法名称
    __objc_classname OC类名
    __objc_methtype OC方法类型
    __entitlements 签名证书
    __unwid_info 用于存储异常情况信息
    __const 初始化的常量
    • __DATA段: 包含了程序数据,该段可写;
    section 描述
    __const 未始化的常量
    __bss 没有初始化和初始化为0 的全局变量
    __nl_symbol_prt / __got 非lazy-binding的指针表
    __la_symbol_prt lazy-binding的指针表,每个表项中的指针一开始指向stub_helper
    __cfstring CoreFoundation string
    __objc_classlist OC类列表
    __objc_catlist OC分类列表
    __objc_protollist OC协议列表
    __objc_imageinfo OC镜像信息
    __objc_const OC类信息、方法列表、属性列表、变量列表
    __objc_selfrefs OC类实例自引用(self)
    __objc_classfrefs OC类类自引用
    __objc_superrefs OC类超类引用(super)
    __objc_ivar OC属性
    __objc_data OC类ISA
    • __LINKEDIT段: 含有为动态链接库使用的原始数据,比如符号,字符串,重定位表条目等等。

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函数。

参考

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容