Mach-O
优质
小牛编辑
129浏览
2023-12-01
Mach-O
Mach-O
(Mach Object
)是macOS
、iOS
、iPad OS
存储程序和库的文件格式。
对应系统通过应用二进制接口(application binary interface
,缩写为 ABI
)来运行该格式的文件。
Mach-O
格式用来替代BSD
系统的a.out
格式。Mach-O
文件格式保存了在 编译过程和链接过程中产生的机器代码和数据,从而为静态链接和动态 链接的代码提供了单一文件格式。
mach-o
= 文件配置(Mach header
) + 二进制代码 (bss段、data段、text段)
可执行文件调用过程
- 调用
fork
函数,创建一个process
调用
execve
或其衍生函数,在该进程上加载,执行我们的Mach-O
文件当我们调用时
execve
(程序加载器),内核实际上在执行以下操作将文件加载到内存
- 开始分析
Mach-O
中的mach_header
,以确认它是有效的Mach-O
文件
虽然macOS
系统使用了很多UNIX上的特性,但它并没有使用ELF作为系统的可执行文件格式,而是使用自家独创的Mach-O文件格式。
苹果一路走来支持的CPU及硬件平台变化较大, 从PowerPC平台
-> x86
-> ARM
、x86-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 | _ |