一、概述

运行时架构(runtime architecture)是针对软件运行环境定义的一系列规则,包括但不限于:

  1. 如何为代码和数据(code and data)排位;
  2. 在内存中怎样去加载或者追踪程序的部分代码;
  3. 告诉编译器应该如何组装代码;
  4. 如何调用系统服务,如加载插件;

Mac 系统支持多种运行时架构,但是内核可以直接读取的可执行文件只有一种:Mach-O。因此,mac 的运行时架构也被命名为:Mach-O Runtime Architecture;因此,Mach-O 是一种存储标准,用于 Mach-O runtime architecture 架构中对程序的磁盘存储;

Mach-O 是 mach object 的缩写,在 -objc解决分类不加载的问题的官方文档中,明确指出所有的源文件都会被转化成一个 objcet,只不过最后经过链接操作,工程或被转化成静态库、动态库或者是可执行文件(类型不同的 mach-O);

Mach-O 文件分为三大部分:

  1. mach-header;
  2. load commands;
  3. segment and section;

二、mach_header

header 位于 Mach-O 文件的头部,其作用是:

  1. 识别 Mach-O 的格式;
  2. 文件类型;
  3. CPU 架构信息;

64 位 header 结构体如下:

struct mach_header_64 {uint32_t    magic;      /* mach magic number identifier */cpu_type_t  cputype;    /* cpu specifier */cpu_subtype_t   cpusubtype; /* machine specifier */uint32_t    filetype;   /* type of file */uint32_t    ncmds;      /* number of load commands */uint32_t    sizeofcmds; /* the size of all the load commands */uint32_t    flags;      /* flags */uint32_t    reserved;   /* reserved */
};

1. magic

一个整数,用于标识该文件为 Mach-O 类型。可以理解成多种类型的文件会被加载,而该 Image 如果值为特定的值,则该 Image 为 Mach-O 类型。

另外,如果该 Mach-O 的架构和编译该 Mach-O 文件的 CPU 字节序(大小端)一致,则使用 MH_MAGIC,相反则使用 MH_CIGAM;

32 和 64 位为固定的值:

/* Constant for the magic field of the mach_header (32-bit architectures) */
#define MH_MAGIC    0xfeedface  /* the mach magic number */
#define MH_CIGAM    0xcefaedfe  /* NXSwapInt(MH_MAGIC) *//* Constant for the magic field of the mach_header_64 (64-bit architectures) */
#define MH_MAGIC_64 0xfeedfacf /* the 64-bit mach magic number */
#define MH_CIGAM_64 0xcffaedfe /* NXSwapInt(MH_MAGIC_64) */

如 dyld 源码中使用这个字段来判断是否为 Mach-O 文件:

image的使用

2. cputype

一个整数,标志该文件将被使用在何种 CPU 架构上;

定义在如下文件中:

image.png

部分 type 如下:

image.png

3. subtype:

arm 架构下有 arm_v7、arm_all 之类的区别,而 subtype 就是表示这个,部分定义如下:

image.png

4. filetype

filetype 就是我们熟知的 Mach-O 文件的类型,比如动态库、主工程生成可执行文件、bundle 等等,部分 type 如下:

type

举个例子

mach-O文件结构分析相关推荐

  1. VS2013 解决方案文件结构分析

    VS2013 解决方案文件结构分析 参考文章: (1)VS2013 解决方案文件结构分析 (2)https://www.cnblogs.com/haogj/p/4248030.html 备忘一下.

  2. Class文件结构分析

    Class文件结构分析 1. Class文件的结构概览图 2. 每一项数据说明 类型 名称 数量 说明 u4 magic 1 魔数:确定一个文件是否是Class文件 u2 minor_version ...

  3. QQWry.dat文件结构分析(zz)

    TITLE  : QQWry.dat文件结构分析 AUTHOR : lionel@nkbbs.org DATE   : 2004/12/18 CONTENT:          最近写一个程序,其中一 ...

  4. midi文件结构分析及生成方法_移动短信技术

    从网上找的,已经将用BC写的改成了VC的,由于对音乐的理解比乐盲还差,对于程序中转换是否有问题我也不得而知,反正用VC生成的MIDI文件听起来惨不忍睹. 对于制作MIDI音乐来说,比播放MIDI文件本 ...

  5. MIDI文件结构分析及生成方法大全

    从网上找的,已经将用BC写的改成了VC的,由于对音乐的理解比乐盲还差,对于程序中转换是否有问题我也不得而知,反正用VC生成的MIDI文件听起来惨不忍睹. 对于制作MIDI音乐来说,比播放MIDI文件本 ...

  6. MIDI文件结构分析及生成方法

    一.MIDI文件结构分析 MIDI文件包含首部块(Header Chunk)和音轨块(Track Chunk)两部分.其格式一般如下: MThd <数据长度> <Header数据&g ...

  7. Angular5.x入门教程2--项目文件结构分析

    项目文件夹结构分析,有图有真相,上图 SRC文件夹内部 未完待续-

  8. python pyc文件解析_Python逆向(二)—— pyc文件结构分析

    #一.前言 上一节我们知道了pyc文件是python在编译过程中出现的主要中间过程文件.pyc文件是二进制的,可以由python虚拟机直接执行的程序.分析pyc文件的文件结构对于实现python编译与 ...

  9. Heritrix源码分析(六) Heritrix的文件结构分析

    本博客属原创文章,欢迎转载!转载请务必注明出处:http://guoyunsky.javaeye.com/blog/642618        欢迎加入Heritrix群(QQ): 109148319 ...

  10. REdis AOF文件结构分析

    REdis-5.0之前的AOF文件没有文件头,不管是REdis-5.0之前还是REdis-5.0,它们的AOF文件体内容都如下图所示: 从REdis-5.0开始,AOF有文件头,目的是支持同时加载RD ...

最新文章

  1. html web上传文件原理,Web上传文件的原理及实现
  2. python求最值_用Python实现最速下降法求极值的方法
  3. java.io.file()_Java IO(一):IO和File
  4. cad抛物线曲线lisp_曲线的转弯半径和曲率 - AutoLISP/Visual LISP 编程技术 - CAD论坛 - 明经CAD社区 - Powered by Discuz!...
  5. Spark 1.4新特性概述
  6. AS3.0第一个实例:(Hello World)
  7. redis 安装错误 jemalloc.h: No such file or directory
  8. Eclipse Java EE 开发 Web 应用程序
  9. oracle 谭岚_Hibernate实现Oracle BLOB的数据读写(2)
  10. java8 ie_Java8语法糖之Lambda表达式_Hudie.的博客-CSDN博客
  11. 作者:张澄(1979-),男,中国联合网络通信有限公司江苏省分公司互联网部大数据中心总监...
  12. 【kafka】kafka 控制台 消费 ip 却找 域名 报错 Can‘t resolve address UnresolvedAddressException
  13. sqrt()平方根计算函数的实现1——二分法
  14. 凸优化第五章对偶 5.6扰动及灵敏度分析
  15. 闻之色变-翻译公司用翻译工具翻译?!
  16. 聚类分析方法的研究与应用综述
  17. 列线图、nomogram到底是什么东西?如何实施?如何解读?
  18. lzw压缩 java_Java压缩之LZW算法字典压缩与解压讲解
  19. python生存曲线_用户行为与生存分析
  20. czl蒻蒟的OI之路14、15

热门文章

  1. 在Spring IoC中,依赖注入和依赖查找的数据来源区别
  2. Java 对象布局、大小工具 jar包工具类jol
  3. Java后端面试题总结一
  4. 软件设计原则(四) 里氏替换原则
  5. Java主线程等待所有子线程执行完毕再执行解决办法集
  6. 打造线上的大数据风控,我们发现了这三个坑
  7. R语言笔记 画多个图
  8. DedeCms网站防挂马注意点
  9. Boost和STL学习资料大全
  10. 旅游后台管理系列——SSM框架Service层整合