zoukankan      html  css  js  c++  java
  • Mach-O 文件格式

    由上所知一个通用二进制格式包含了很多个 Mach-O 文件格式,下面我们来具体说说这个格式。Mach-O 文件格式在官方文档中有一个描述图,是很多教程中都引用到的,我重新绘制了一版更清晰的:

    mach-o可以看的出 Mach-O 主要由 3 部分组成:

    • Mach-O 头(Mach Header):这里描述了 Mach-O 的 CPU 架构、文件类型以及加载命令等信息;
    • 加载命令(Load Command):描述了文件中数据的具体组织结构,不同的数据类型使用不同的加载命令表示;
    • 数据区(Data):Data 中每一个段(Segment)的数据都保存在此,段的概念和 ELF 文件中段的概念类似,都拥有一个或多个 Section ,用来存放数据和代码。

    在正式进入加载命令这一过程之前,先来学习一下 Mach-O 的 Data 区域,其中由 Segment 段和 Section 节组成。先来说 Segment 的组成,以下代码仍旧来自 loader.h

    部分的 Segment (主要指的 __TEXT 和 __DATA)可以进一步分解为 Section。之所以按照 Segment -> Section 的结构组织方式,是因为在同一个 Segment 下的 Section,可以控制相同的权限,也可以不完全按照 Page 的大小进行内存对其,节省内存的空间。而 Segment 对外整体暴露,在程序载入阶段映射成一个完整的虚拟内存,更好的做到内存对齐(可以继续参考 OS X & iOS Kernel Programming 一书的第一章内容)。下面给出 Section 具体的数据结构

    下面列举一些常见的 Section。

    Section用途
    __TEXT.__text 主程序代码
    __TEXT.__cstring C 语言字符串
    __TEXT.__const const 关键字修饰的常量
    __TEXT.__stubs 用于 Stub 的占位代码,很多地方称之为桩代码。
    __TEXT.__stubs_helper 当 Stub 无法找到真正的符号地址后的最终指向
    __TEXT.__objc_methname Objective-C 方法名称
    __TEXT.__objc_methtype Objective-C 方法类型
    __TEXT.__objc_classname Objective-C 类名称
    __DATA.__data 初始化过的可变数据
    __DATA.__la_symbol_ptr lazy binding 的指针表,表中的指针一开始都指向 __stub_helper
    __DATA.nl_symbol_ptr 非 lazy binding 的指针表,每个表项中的指针都指向一个在装载过程中,被动态链机器搜索完成的符号
    __DATA.__const 没有初始化过的常量
    __DATA.__cfstring 程序中使用的 Core Foundation 字符串(CFStringRefs
    __DATA.__bss BSS,存放为初始化的全局变量,即常说的静态内存分配
    __DATA.__common 没有初始化过的符号声明
    __DATA.__objc_classlist Objective-C 类列表
    __DATA.__objc_protolist Objective-C 原型
    __DATA.__objc_imginfo Objective-C 镜像信息
    __DATA.__objc_selfrefs Objective-C self 引用
    __DATA.__objc_protorefs Objective-C 原型引用
    __DATA.__objc_superrefs Objective-C 超类引用

     https://www.desgard.com/iOS-Source-Probe/C/mach-o/Mach-O%20文件格式探索.html

    ------------------越是喧嚣的世界,越需要宁静的思考------------------ 合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下。 积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得,圣心备焉。故不积跬步,无以至千里;不积小流,无以成江海。骐骥一跃,不能十步;驽马十驾,功在不舍。锲而舍之,朽木不折;锲而不舍,金石可镂。蚓无爪牙之利,筋骨之强,上食埃土,下饮黄泉,用心一也。蟹六跪而二螯,非蛇鳝之穴无可寄托者,用心躁也。
  • 相关阅读:
    【情人节礼物】纯js脚本打造精美3D玫瑰
    程序员成长系列(一):手里必须有一套自己的框架
    从灌篮高手谈项目团队组成
    【java下午茶】12306的双人票
    从怀孕编程谈公司管理
    程序员的灵光一闪
    【java下午茶系列】java三重奏之封装
    程序员的每周工作40小时之路
    程序员真适合自由的环境吗
    程序员真的需要升职吗?
  • 原文地址:https://www.cnblogs.com/feng9exe/p/15126217.html
Copyright © 2011-2022 走看看