Objective-C Mach-O文件格式深入理解

Mach-O(Mach Object),是一种基于Mach内核的文件格式,苹果很多文件都采用这种格式,最常见的就是可执行文件和动态库。

当然,还有.o的目标文件、.a和.framework的静态库以及动态连接器dyld等等。

利用MachOView可以查看Mach-O文件的内部结构,以Mac微信为例: 

Objective-C Mach-O文件格式深入理解

1、Mach64 Header(文件头)

包含模数、CPU类型、文件类型、加载指令的数量和大小以及文件状态信息。

Objective-C Mach-O文件格式深入理解

1)模数:表示该二进制所支持的CPU位数,用于校验。

#define MH_MAGIC 0xfeedface // 32位
#define MH_MAGIC_64 0xfeedfacf // 64位

2)文件状态信息:即Flags,包含一些状态位。例如MH_DYLDLINK,表示该二进制不能再静态链接。 

2、Load Commands(加载指令)

Objective-C Mach-O文件格式深入理解Objective-C Mach-O文件格式深入理解

1)LC_SEGMENT_64:加载段

  __TEXT:代码段

  __DATA:数据段

2)LC_DYLD_INFO_ONLY:

3)LC_SYMTAB:加载符号表,

4)LC_DYSYMTAB:加载符号表

5)LC_LOAD_DYLINKER:加载动态链接器dyld,用于后续加载动态库。

Objective-C Mach-O文件格式深入理解

6)LC_UUID:加载二进制的UUID,唯一标识,常用于解析crash堆栈。

Objective-C Mach-O文件格式深入理解

7)LC_VERSION_MIN_MACOSX:加载该二进制支持的最小操作系统版本,对应于工程配置中的Deployment Target。

Objective-C Mach-O文件格式深入理解

8)LC_SOURCE_VERSION:

9)LC_MAIN:加载main函数。

10)LC_DYLIB:加载动态库,外挂如WeChatPlugin,会增加一条这样的指令,用于加载自定义的动态库。

Objective-C Mach-O文件格式深入理解

11)LC_RPATH:加载@rpath,对应于工程配置中的Runpath Search Paths。

Objective-C Mach-O文件格式深入理解12)LC_FUNCTION_STARTS:加载函数入口信息。

13)LC_DATA_IN_CODE:

14)LC_CODE_SIGNATURE:加载签名,用于校验,外挂如WeChatPlugin,会删掉这条指令。

3、Session64(节)

Objective-C Mach-O文件格式深入理解

1)__objc_classlist:class-dump就是利用这节把应用的类和对应的方法导出来。

  

参考链接:

https://developer.apple.com/documentation/kernel/mach_header_64/1525810-flags?language=objc

https://opensource.apple.com/source/xnu/xnu-4570.1.46/EXTERNAL_HEADERS/mach-o/loader.h.auto.html

https://sourceforge.net/projects/machoview/

注:通常所说的XNU内核是Mach的封装。