Mach-O Header
作用
Mach-O Header 是整个文件的"身份证"和"目录",位于文件最开头(偏移0)。
核心功能
1. 身份识别
- Magic Number:
0xFEEDFACE(32位) /0xFEEDFACF(64位) - 告诉操作系统:"我是一个Mach-O文件"
2. 架构信息
- cputype: 目标CPU架构(如
CPU_TYPE_X86_64,CPU_TYPE_ARM64) - cpusubtype: 具体型号(如
CPU_SUBTYPE_ARM64E)
3. 文件类型
| 类型 | 说明 |
|---|---|
MH_EXECUTE | 可执行文件(普通App) |
MH_DYLIB | 动态库(.dylib/.framework) |
MH_OBJECT | 目标文件(.o,编译中间产物) |
MH_BUNDLE | Bundle(插件,如 .bundle) |
MH_DYLINKER | 动态链接器(dyld本身) |
4. 导航信息
- ncmds: 后面有多少个 Load Commands(加载命令)
- sizeofcmds: 这些命令总共占多少字节
5. 特性标志(Flags)
MH_PIE: 启用地址空间布局随机化(随机基址)MH_NO_REEXPORTED_DYLIBS: 不重新导出依赖库的符号MH_TWOLEVEL: 使用两级命名空间(避免符号冲突)
数据结构(64位)
struct mach_header_64 {
uint32_t magic; // 0xFEEDFACF
uint32_t cputype; // CPU_TYPE_ARM64 = 0x0100000C
uint32_t cpusubtype; // 如 0x80000002 (ARM64e)
uint32_t filetype; // MH_EXECUTE = 0x2
uint32_t ncmds; // Load Command 数量
uint32_t sizeofcmds; // Load Command 总大小
uint32_t flags; // 各种标志位
uint32_t reserved; // 64位专用,保留
};
实际查看
# -h print the mach header
# -v print verbosely (symbolically) when possible
otool -h /bin/ls # 简化版
otool -hv /bin/ls # 详细版(带标志位解释)
# 简化版
otool -h /bin/ls
/bin/ls:
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
0xfeedfacf 16777228 2 0x80 2 20 1712 0x00200085
# 详细版(带标志位解释)
otool -hv /bin/ls
/bin/ls:
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
MH_MAGIC_64 ARM64 E USR00 EXECUTE 20 1712 NOUNDEFS DYLDLINK TWOLEVEL PIE
一句话总结
Header 回答了"这是什么文件、给什么CPU用、后面还有什么内容"这三个问题,是解析Mach-O的第一步。