mach-O文件结构分析
一、概述
运行时架构(runtime architecture)是针对软件运行环境定义的一系列规则,包括但不限于:
- 如何为代码和数据(code and data)排位;
- 在内存中怎样去加载或者追踪程序的部分代码;
- 告诉编译器应该如何组装代码;
- 如何调用系统服务,如加载插件;
Mac 系统支持多种运行时架构,但是内核可以直接读取的可执行文件只有一种:Mach-O。因此,mac 的运行时架构也被命名为:Mach-O Runtime Architecture;因此,Mach-O 是一种存储标准,用于 Mach-O runtime architecture 架构中对程序的磁盘存储;
Mach-O 是 mach object 的缩写,在 -objc
解决分类不加载的问题的官方文档中,明确指出所有的源文件都会被转化成一个 objcet,只不过最后经过链接操作,工程或被转化成静态库、动态库或者是可执行文件(类型不同的 mach-O);
Mach-O 文件分为三大部分:
- mach-header;
- load commands;
- segment and section;
二、mach_header
header 位于 Mach-O 文件的头部,其作用是:
- 识别 Mach-O 的格式;
- 文件类型;
- 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 文件:
2. cputype
一个整数,标志该文件将被使用在何种 CPU 架构上;
定义在如下文件中:
部分 type 如下:
3. subtype:
arm 架构下有 arm_v7、arm_all 之类的区别,而 subtype 就是表示这个,部分定义如下:
4. filetype
filetype 就是我们熟知的 Mach-O 文件的类型,比如动态库、主工程生成可执行文件、bundle 等等,部分 type 如下:
举个例子
mach-O文件结构分析相关推荐
- VS2013 解决方案文件结构分析
VS2013 解决方案文件结构分析 参考文章: (1)VS2013 解决方案文件结构分析 (2)https://www.cnblogs.com/haogj/p/4248030.html 备忘一下.
- Class文件结构分析
Class文件结构分析 1. Class文件的结构概览图 2. 每一项数据说明 类型 名称 数量 说明 u4 magic 1 魔数:确定一个文件是否是Class文件 u2 minor_version ...
- QQWry.dat文件结构分析(zz)
TITLE : QQWry.dat文件结构分析 AUTHOR : lionel@nkbbs.org DATE : 2004/12/18 CONTENT: 最近写一个程序,其中一 ...
- midi文件结构分析及生成方法_移动短信技术
从网上找的,已经将用BC写的改成了VC的,由于对音乐的理解比乐盲还差,对于程序中转换是否有问题我也不得而知,反正用VC生成的MIDI文件听起来惨不忍睹. 对于制作MIDI音乐来说,比播放MIDI文件本 ...
- MIDI文件结构分析及生成方法大全
从网上找的,已经将用BC写的改成了VC的,由于对音乐的理解比乐盲还差,对于程序中转换是否有问题我也不得而知,反正用VC生成的MIDI文件听起来惨不忍睹. 对于制作MIDI音乐来说,比播放MIDI文件本 ...
- MIDI文件结构分析及生成方法
一.MIDI文件结构分析 MIDI文件包含首部块(Header Chunk)和音轨块(Track Chunk)两部分.其格式一般如下: MThd <数据长度> <Header数据&g ...
- Angular5.x入门教程2--项目文件结构分析
项目文件夹结构分析,有图有真相,上图 SRC文件夹内部 未完待续-
- python pyc文件解析_Python逆向(二)—— pyc文件结构分析
#一.前言 上一节我们知道了pyc文件是python在编译过程中出现的主要中间过程文件.pyc文件是二进制的,可以由python虚拟机直接执行的程序.分析pyc文件的文件结构对于实现python编译与 ...
- Heritrix源码分析(六) Heritrix的文件结构分析
本博客属原创文章,欢迎转载!转载请务必注明出处:http://guoyunsky.javaeye.com/blog/642618 欢迎加入Heritrix群(QQ): 109148319 ...
- REdis AOF文件结构分析
REdis-5.0之前的AOF文件没有文件头,不管是REdis-5.0之前还是REdis-5.0,它们的AOF文件体内容都如下图所示: 从REdis-5.0开始,AOF有文件头,目的是支持同时加载RD ...
最新文章
- html web上传文件原理,Web上传文件的原理及实现
- python求最值_用Python实现最速下降法求极值的方法
- java.io.file()_Java IO(一):IO和File
- cad抛物线曲线lisp_曲线的转弯半径和曲率 - AutoLISP/Visual LISP 编程技术 - CAD论坛 - 明经CAD社区 - Powered by Discuz!...
- Spark 1.4新特性概述
- AS3.0第一个实例:(Hello World)
- redis 安装错误 jemalloc.h: No such file or directory
- Eclipse Java EE 开发 Web 应用程序
- oracle 谭岚_Hibernate实现Oracle BLOB的数据读写(2)
- java8 ie_Java8语法糖之Lambda表达式_Hudie.的博客-CSDN博客
- 作者:张澄(1979-),男,中国联合网络通信有限公司江苏省分公司互联网部大数据中心总监...
- 【kafka】kafka 控制台 消费 ip 却找 域名 报错 Can‘t resolve address UnresolvedAddressException
- sqrt()平方根计算函数的实现1——二分法
- 凸优化第五章对偶 5.6扰动及灵敏度分析
- 闻之色变-翻译公司用翻译工具翻译?!
- 聚类分析方法的研究与应用综述
- 列线图、nomogram到底是什么东西?如何实施?如何解读?
- lzw压缩 java_Java压缩之LZW算法字典压缩与解压讲解
- python生存曲线_用户行为与生存分析
- czl蒻蒟的OI之路14、15