Mach-O
![本頁使用了標題或全文手工轉換](http://images.weserv.nl/?url=//upload.wikimedia.org/wikipedia/commons/thumb/c/cd/Zh_conversion_icon_m.svg/35px-Zh_conversion_icon_m.svg.png)
![]() | |
副檔名 |
無, .o, .dylib |
---|---|
統一類型標識 | com.apple.mach-o-binary |
開發者 | 卡內基梅隆大學/蘋果公司 |
格式類型 | 二進位檔案,可執行檔,目的碼,動態函式庫,核心轉儲 |
作為容器 | ARM,SPARC,PA-RISC,PowerPC以及x86的可執行檔,主記憶體轉儲 |
Mach-O為Mach Object檔案格式的縮寫,它是一種用於可執行檔,目的碼,動態函式庫,核心轉儲的檔案格式。作為a.out格式的替代者,Mach-O提供了更強的擴充性,並提升了符號表中資訊的存取速度。
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 (頁面存檔備份,存於網際網路檔案館)