Mach-O
Mach-O为Mach Object文档格式的缩写,它是一种用于可运行档,目标代码,动态函数库,内核转储的文件格式。作为a.out格式的替代者,Mach-O提供了更强的扩展性,并提升了符号表中信息的速度。
![]() | |
无, .o, .dylib | |
统一类型标识 | com.apple.mach-o-binary |
开发者 | 卡内基梅隆大学/苹果公司 |
格式类型 | 二进制文档,可执行文档,目标代码,动态函数库,内核转储 |
作为容器 | ARM,SPARC,PA-RISC,PowerPC以及x86的可执行文档,内存转储 |
Mach-O曾经为大部分基于Mach内核的操作系统所使用。NeXTSTEP,Darwin和Mac OS X等系统使用这种格式作为其原生可运行档,和目标代码的格式。而同样使用GNU Mach作为其微内核的GNU Hurd系统则使用ELF而非Mach-O作为其标准的二进制文件格式。
Mach-O文档结构
每个Mach-O文件包括一个Mach-O,然后是一系列的载入命令,再是一个或多个区块,每个块包括0到255个段。Mach-O使用REL再格式控制对符号的引用。Mach-O在两级命名空间中将每个符号编码成“对象-符号名”对,在查找符号时则采用线性搜索法。
Mach-O的基本结构,引用了文件中数据页的变长「加载指令」表,也用于Accent内核的可执行档格式中,而这种格式则是基于来自Spice Lisp的理念。
多重架构二进制
在NeXTSTEP,OPENSTEP和Mac OS X中,可以将多个Mach-O文件组合进一个多重架构二进制文件中,以用一个单独的二进制文件多种架构的指令集。例如,一个Mac OS X中的多重架构二进制可以包含32比特和64比特的PowerPC代码,或PowerPC和x86的32比特代码,甚至包含32比特的PowerPC代码,64比特PowerPC代码,32比特x86代码和64比特x86(AMD64)。
Mach-O的未来
由于Darwin 10.0(对应Mac OS X 10.6)中对Mach-O的结构定义进行了一些重要的修改,因此在Mac OS X 10.6中以选项编译的二进制只能在10.6平台中运行。其差异之一在于Mac OS X的连接器(dyld
)产生的载入命令无法为早期版本的Mac OS X所理解。另外一个重要改变是Link Edit表(__LINKEDIT段)的作用。在10.6中,新的Link Edit表中的无用信息会被去除,从而起到压缩的作用,而Mac OS X 10.5及以前的版本无法识别这种新格式。为解决这个问题,在时常常需要使用-mmacosx-version-min=
连接器标志。苹果公司作为Mach-O格式的维护者,推荐开发者在创建二进制的时候使用与其所用的对应SDK版本标志。
外部链接
- Mach-O File Format Reference (Apple Inc.)
- Mach Object Files
- Mach-O Dynamic Library Reference (页面存档备份,存于)
- Mach-O Manual Page (页面存档备份,存于)
- Mach-O Viewer (页面存档备份,存于)