Mach-O中的header

6 阅读2分钟

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_BUNDLEBundle(插件,如 .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的第一步。