版權(quán)歸原作者所有,如有侵權(quán),請聯(lián)系我們

[科普中國]-Mach-O

科學(xué)百科
原創(chuàng)
科學(xué)百科為用戶提供權(quán)威科普內(nèi)容,打造知識(shí)科普陣地
收藏

Mach-OMach Object文件格式的縮寫,它是一種用于可執(zhí)行文件,目標(biāo)代碼,動(dòng)態(tài)庫,內(nèi)核轉(zhuǎn)儲(chǔ)的文件格式。作為a.out格式的替代,Mach-O提供了更強(qiáng)的擴(kuò)展性,并提升了符號(hào)表中信息的訪問速度。

簡介Mach-O曾經(jīng)為大部分基于Mach核心的操作系統(tǒng)所使用。NeXTSTEP,Darwin和Mac OS X等系統(tǒng)使用這種格式作為其原生可執(zhí)行文件,庫和目標(biāo)代碼的格式。而同樣使用GNU Mach作為其微內(nèi)核的GNU Hurd系統(tǒng)則使用ELF而非Mach-O作為其標(biāo)準(zhǔn)的二進(jìn)制文件格式。

Mach-O文件結(jié)構(gòu)每個(gè)Mach-O文件包括一個(gè)Mach-O頭,然后是一系列的載入命令,再是一個(gè)或多個(gè),每個(gè)塊包括0到255個(gè)。Mach-O使用REL再定位格式控制對符號(hào)的引用。Mach-O在兩級(jí)命名空間中將每個(gè)符號(hào)編碼成“對象-符號(hào)名”對,在查找符號(hào)時(shí)則采用線性搜索法。

Mach-O的基本結(jié)構(gòu),引用了文件中數(shù)據(jù)頁的變長“加載命令”表,也用于Accent核心的可執(zhí)行文件格式中,而這種格式則是基于來自Spice Lisp的理念。1

多重架構(gòu)二進(jìn)制在NeXTSTEP,OPENSTEP和Mac OS X中,可以將多個(gè)Mach-O文件組合進(jìn)一個(gè)多重架構(gòu)二進(jìn)制文件中,以用一個(gè)單獨(dú)的二進(jìn)制文件支持多種架構(gòu)的指令集。例如,一個(gè)Mac OS X中的多重架構(gòu)二進(jìn)制可以包含32位和64位的PowerPC代碼,或PowerPC和x86的32位代碼,甚至包含32位的PowerPC代碼,64位PowerPC代碼,32位x86代碼和64位x86代碼。

Mach-O的未來由于Darwin 10.0(對應(yīng)Mac OS X 10.6)中對Mach-O文件的結(jié)構(gòu)定義進(jìn)行了一些重要的修改,因此在Mac OS X 10.6中以默認(rèn)選項(xiàng)編譯的二進(jìn)制只能在10.6平臺(tái)中運(yùn)行。其差異之一在于Mac OS X的連接器(dyld)產(chǎn)生的載入命令無法為早期版本的Mac OS X所理解。另外一個(gè)重要改變是Link Edit表(__LINKEDIT段)的作用。在10.6中,新的Link Edit表中的無用信息會(huì)被去除,從而起到壓縮的作用,而Mac OS X 10.5及以前的版本無法識(shí)別這種新格式。為解決這個(gè)問題,在連接時(shí)常常需要使用-mmacosx-version-min=連接器標(biāo)志。蘋果公司作為Mach-O格式的維護(hù)者,推薦開發(fā)者在創(chuàng)建二進(jìn)制應(yīng)用程序的時(shí)候與使用與所用的SDK版本對應(yīng)的該標(biāo)志。

本詞條內(nèi)容貢獻(xiàn)者為:

鄢志丹 - 副教授 - 中國石油大學(xué)(華東)