Mach-O是iOS/macOS系统上应用程序的文件格式,是Mach object的缩写,是Mac\iOS上用于存储程序、库的标准格式.了解Mach-O文件的格式,对于动态调试、静态分析等都有很大的帮助.
1.通用二进制文件
由于iOS需要支持不同的CPU架构,所有默认打包出来的是一个通用二进制文件(Universal Binary也称为胖二进制文件),包含了多种不同架构的独立的二进制文件.
可以使用file命令查看文件信息:
实际上通用二进制文件只是将不同架构的Mach-O文件打包在了一起,再在文件起始位置加上fat_header结构来说明Mach-O文件支持的架构和偏移地址信息.
可以下载XNU源码,在源码文件夹下的EXTERNAL_HEADERS/mach-o/fat.h查看通用二进制文件的定义
2.Mach-O文件类型
根据XNU源码在EXTERNAL_HEADERS/mach-o/loader.h中的的定义如下图:
下面介绍常用的文件类型:
1.MH_OBJECT:目标文件(.o文件)/静态库文件
2.MH_EXECUTE:应用程序的可执行文件
3.MH_DYLIB:动态库文件,如.dylib/.framework文件
4.MH_DYLINKER:动态链接编辑器,/usr/lib/dyld
5.MH_DSYM:存储着二进制文件符号信息文件(分析App崩溃信息)
3.Mach-O基本结构
如图所示Mach-O文件由三部分组成:
1.Header(Mach-O头部):保存了文件类型,CPU架构,加载命令数量等基本信息
2.Load Commands(加载命令):描述文件在虚拟内存的布局、结构.告诉加载器如何处理二进制数据
3.Data:在Load Commands定义的原始数据
这篇简单介绍了什么是Mach-O文件以及属于Mach-O文件的文件类型和Mach-O的基本结构.下篇文章将介绍源码定义在Header和Load Commands的一些字段含义