複製鏈接
請複製以下鏈接發送給好友

Mach-O

鎖定
Mach-OMach Object文件格式的縮寫,它是一種用於可執行文件目標代碼動態庫,內核轉儲的文件格式。作為a.out格式的替代,Mach-O提供了更強的擴展性,並提升了符號表中信息的訪問速度。
中文名
Mach object
簡    寫
Mach-O
基    於
Mach核心的系統
類    別
可執行文件格式

Mach-O簡介

Mach-O曾經為大部分基於Mach核心的操作系統所使用。NeXTSTEPDarwinMac OS X等系統使用這種格式作為其原生可執行文件,庫和目標代碼的格式。而同樣使用GNU Mach作為其微內核的GNU Hurd系統則使用ELF而非Mach-O作為其標準的二進制文件格式。

Mach-OMach-O文件結構

每個Mach-O文件包括一個Mach-O頭,然後是一系列的載入命令,再是一個或多個,每個塊包括0到255個。Mach-O使用REL再定位格式控制對符號的引用。Mach-O在兩級命名空間中將每個符號編碼成“對象-符號名”對,在查找符號時則採用線性搜索法。
Mach-O的基本結構,引用了文件中數據頁的變長“加載命令”表,也用於Accent核心的可執行文件格式中,而這種格式則是基於來自Spice Lisp的理念。 [1] 

Mach-O多重架構二進制

NeXTSTEPOPENSTEPMac OS X中,可以將多個Mach-O文件組合進一個多重架構二進制文件中,以用一個單獨的二進制文件支持多種架構的指令集。例如,一個Mac OS X中的多重架構二進制可以包含32位64位PowerPC代碼,或PowerPC和x86的32位代碼,甚至包含32位的PowerPC代碼,64位PowerPC代碼,32位x86代碼和64位x86代碼。

Mach-OMach-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版本對應的該標誌。
參考資料
  • 1.    Biv R G, Virus M M. Infecting Mach-O Files[J]. 2006.