a.out
![本頁使用了標題或全文手工轉換](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, .so |
---|---|
開發者 | AT&T |
格式類型 | 二進制檔案、執行檔、目的碼、函數庫 |
a.out是舊版類Unix系統中用於執行檔、目的碼和後來系統中的函數庫的一種檔案格式,這個名稱的意思是組譯器輸出。
儘管目前大多數類Unix系統都已改用ELF格式,不再採用a.out格式,但編譯器和連結器依然會在用戶未指定檔名時,將輸出檔案取名為「a.out」。[1]
應用
在UNIX第一版中,就出現了給PDP-7和PDP-11用的a.out格式。[2]之後它被UNIX System V中的COFF所取代,而COFF最後也被SVR4中的ELF格式所取代。
儘管BSD曾經沿用了一段時間的a.out格式,但較新的BSD系統都已切換到ELF。NetBSD/i386在1.5版中正式從a.out切換到ELF,FreeBSD/i386則是在2.2到3.0的轉換中切換到ELF的。
a.out格式對除錯資訊的支援是由符號表中稱作「stabs」的特殊項實現的。許多COFF和ELF變體中也用到了stabs格式。
Linux在1.2版內核之前也曾使用a.out格式(實驗性的1.1.52版中加入了對ELF的支援),在此之後也被ELF取代了。 [3]Linux之所以轉向ELF,或多或少是因為在此平台上構建一個a.out格式的函數庫所需的複雜性過高:因為Linux中a.out的ld.so不能重定位共用函數庫,所以需要一個中央機構來註冊各個函數庫的虛擬地址域。[4]一些BSD變體在Linux被迫轉向ELF之後仍然用了很久的a.out格式,因為相比於Linux,BSD的a.out略微更靈活一些。[5]由於a.out格式的相關代碼已經老舊並缺乏維護,而且已經幾乎沒有使用a.out格式的存在,5.1版內核決定移除相應的功能支援。[6]
MINIX 3仍將a.out作為二進制檔案的格式,但其不支援共用函數庫。
格式
a.out執行檔通常是以下幾種變體之一:OMAGIC、NMAGIC、QMAGIC或ZMAGIC。
- OMAGIC
- OMAGIC格式在檔案頭後有連續段,沒有文字和數據的分離。也被用作目標文件格式。
- NMAGIC
- NMAGIC格式與OMAGIC相像,但數據段出現在文字段結束後的下一頁,且文字段被標為唯讀。
- ZMAGIC
- ZMAGIC格式加入了對按需分頁的支援,代碼段和數據段的長度需要是頁寬的整數倍。
- QMAGIC
- QMAGIC二進制檔案通常被載入在虛擬地址池的底端,用以通過段錯誤擷取對空指標的解除參照。a.out頭部與文字段的第一頁合併,通常會省下一頁的主記憶體。
- CMAGIC
- 舊版的Linux使用此格式來存放核心轉儲。
a.out檔案包含至多七節,順序如下:
- 執行頭部
- 包含內核將二進制檔案載入入主記憶體並執行所需的參數,也包含對動態連結器ld的指引。僅有本節是必須出現的。
- 文字段
- 包含執行時被載入主記憶體的機械碼和相關數據,可能是唯讀的。
- 數據段
- 包含已初始化的數據,總是可寫的。
- 文字重定位
- 包含連結編輯器在合併二進制檔案時修改文字段指標的記錄。
- 數據重定位
- 與文字重定位一節類似,但是給數據段指標用的。
- 符號表
- 包含連結編輯器用於交叉參照不同二進制檔案中變數和函數(符號)的記錄。
- 字串表
- 包含對應於符號表的字串。
參見
- Portable Executable
- ELF
- Vasm,一個自由的組譯器
參考資料
- ^ Rupert Wood. What to do with a.out. gcc-help (郵寄清單). 2002-04-08 [2007-04-28]. (原始內容存檔於2007-02-24).
- ^ Dennis Ritchie. a.out — assembler and link editor output (PDF). Bell Labs. 1971-11-03 [2006-11-24]. (原始內容 (PDF)存檔於2006-12-07).
- ^ Daniel Barlow. The Linux ELF HOWTO (v1.29). 14 July 1996 [2008-03-28]. (原始內容存檔於2004-07-13).
- ^ Ulrich Drepper. How To Write Shared Libraries (PDF). 4.0. 2006-08-20 [2007-06-20]. (原始內容 (PDF)存檔於2007-06-16).
When introducing shared libraries certain design decisions had to be made to work in the limitations of a.out. (...) For all these reasons and more, Linux converted early on to using ELF (Executable Linkage Format) as the binary format.
|section=
被忽略 (幫助) - ^ BSD Myths: BSD uses the a.out executable format, which is outdated technology. [2007-04-10]. (原始內容存檔於2007-04-17).
- ^ Borislav Petkov. x86: Deprecate a.out support. 5 March 2019 [5 March 2019]. (原始內容存檔於2020-09-19).
Linux supports ELF binaries for ~25 years now. a.out coredumping has bitrotten quite significantly and would need some fixing to get it into shape again but considering how even the toolchains cannot create a.out executables in its default configuration, let's deprecate a.out support and remove it a couple of releases later, instead.