Mach-O

Mach-O为Mach Object文件格式的缩写，它是一种用于可執行檔，目标代码，動態函式庫，内核转储的檔案格式。作为a.out格式的替代者，Mach-O提供了更强的扩展性，并提升了符号表中資訊的-{zh-hans:访问;zh-hant:存取}-速度。

Mach-O曾经为大部分基于Mach核心的作業系統所使用。NeXTSTEP，Darwin和Mac OS X等系统使用这种格式作为其原生可執行檔，-{zh-hans:库;zh-hant:函式庫}-和目标代码的格式。而同样使用GNU Mach作为其微内核的GNU Hurd系统则使用ELF而非Mach-O作为其标准的二进制檔案格式。

 Mach-O文件结构 
每个Mach-O檔案包括一个Mach-O-{zh-hans:头;zh-hant:標頭}-，然后是一系列的载入命令，再是一个或多个區塊，每个块包括0到255个段。Mach-O使用REL再-{定位}-格式控制对符号的引用。Mach-O在两级命名空间中将每个符号编码成“对象-符号名”对，在查找符号时则采用线性搜索法。

Mach-O的基本结构，引用了檔案中数据页的变长「載入指令」表，也用于Accent核心的可执行檔格式中，而这种格式则是基于来自Spice Lisp的理念。

 多重架构二进制 
在NeXTSTEP，OPENSTEP和Mac OS X中，可以将多个Mach-O檔案组合进一个多重架构二进制檔案中，以用一个单独的二进制檔案-{zh-hans:支持;zh-hant:支援}-多种架构的指令集。例如，一个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-{zh-hans:文件;zh-hant:檔案}-的结构定义进行了一些重要的修改，因此在Mac OS X 10.6中以-{zh-hans:默认;zh-hant:預設}-选项编译的二进制-{zh-hans:文件;zh-hant:檔案}-只能在10.6平台中运行。其差异之一在于Mac OS X的连接器（dyld）产生的载入命令无法为早期版本的Mac OS X所理解。另外一个重要改变是Link Edit表（__LINKEDIT段）的作用。在10.6中，新的Link Edit表中的无用資訊会被去除，从而起到压缩的作用，而Mac OS X 10.5及以前的版本无法识别这种新格式。为解决这个问题，在-{zh-cn:连接;zh-tw:連結}-时常常需要使用-mmacosx-version-min=连接器标志。苹果公司作为Mach-O格式的维护者，推荐开发者在建立二进制-{zh-hans:应用程序;zh-hant:應用程式}-的时候使用与其所用的對應SDK版本标志。

参见
 胖二进制
 通用二进制
 Xcode

外部链接
Mach-O File Format Reference (Apple Inc.)
Mach Object Files
Mach-O Dynamic Library Reference 
Mach-O Manual Page 
Mach-O Viewer 

Category:MacOS開發
Category:NeXT
Category:Mach
Category:可执行文件格式