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.