Mach-O

优质
小牛编辑
129浏览
2023-12-01

Mach-O

Mach-O(Mach Object)是macOSiOSiPad OS存储程序和库的文件格式。
对应系统通过应用二进制接口(application binary interface,缩写为 ABI)来运行该格式的文件。

Mach-O格式用来替代BSD系统的a.out格式。
Mach-O文件格式保存了在 编译过程和链接过程中产生的机器代码和数据,从而为静态链接和动态 链接的代码提供了单一文件格式。

可执行文件调用过程

  1. 调用fork函数,创建一个process
  2. 调用execve或其衍生函数,在该进程上加载,执行我们的Mach-O文件

    • 当我们调用时execve(程序加载器),内核实际上在执行以下操作

    • 将文件加载到内存

    • 开始分析Mach-O中的mach_header,以确认它是有效的Mach-O文件

虽然macOS系统使用了很多UNIX上的特性,但它并没有使用ELF作为系统的可执行文件格式,而是使用自家独创的Mach-O文件格式。

苹果一路走来支持的CPU及硬件平台变化较大, 从PowerPC平台 -> x86 -> ARMx86-64

为了解决软件在多个硬件平台上的兼容性问题,苹果开发了一个通用的二进制文件格式(Universal Binary)。 又称为胖二进制(Fat Binary),通用二进制文件中将多个支持不同CPU架构的二进制文件打包成一个文件,系统在加载运行该程序时,会根据通用二进制文件中提供的多个架构来与当前系统平台做匹配,运行适合当前系统的那个版本。

通用二进制的“通用”不止针对可以直接运行的可执行程序,系统中的动态库dylib、静态库.a文件以及框架等都可以是通用二进制文件,对它们也可以同样使用lipo命令来进行管理。

Mach-O结构主要包含Header、segment、section

文件头mach64 Header文件类型、大小等信息
加载命令Load Commands指示加载器如何加载二进制文件
文本段__TEXT类似PE的.text段
数据段__DATA类似PE的.data段
动态库加载信息Dynamic Loader Info-
入口函数Function Starts-
符号表Symbol Table-
符号表Symbol Table-
动态库符号表Dynamic Symbol Table-
字符串表String Table_