要了解為甚麼 FreeBSD 使用 a.out
格式, 首先你要知道一些
目前 Unix 中使用最廣泛的三種格式:
最早和`古典'的 unix 目的檔格式. 使用一種短而緊密的檔頭, 伴隨一個通常用來辨認格式的魔術數字(參考 a.out(5) 有更多細節). 具有三個節區: .text, .data, 和 .bss 加上一個符號表和字串表.
SVR3 目的檔格式. 檔頭包含了一個節區表, 所以可以具備比 .text, .data, .bss 還多的節區.
COFF
的後繼者, 具有多個節區以及 32-bit 或 64-bit 的
possible values. 主要的缺點:ELF
是在每個系統架構只
會有一種 ABI 的假設下設計出來的. 事實上這個假設錯的離譜,
即使是商業的 SYSV 世界, 也至少有 SVR4, Solaris, SCO 三種 ABI.
FreeBSD 藉由一個工具, 把程式需要那種 ABI 的資訊 烙印
在 ELF
執行檔上.
參考 man page
brandelf 取得更多資訊.
FreeBSD 來自 "古典" 陣營, 傳統上都使用
a.out 格式, 這是在好幾代的 BSD 中證明可靠的計術.
雖然可以在 FreeBSD 上可以建立以及執行原生的 ELF
執行檔(
以及核心), 剛開始 FreeBSD 反對轉換到以 ELF
做為預設的
格式. 為甚麼? 嗯. 當 Linux 開始痛苦地轉換至 ELF
, 並非因為
要逃離 a.out
格式, 而是因為他們沒有彈性的, 以跳躍表為基礎
的共享程式庫機制. 那是一種非常難以使用, 發展者不喜歡的東西. 既
然已經存在的 ELF
工具提供了共享程式庫的解決方案, 而且看來
是 "前衛的方法", 所需的代價就可接受因而轉換.
在 FreeBSD 的狀況中, 我們的共享程式庫機制更接近 SunOS
的
型式, 也就是, 易於使用.
然而, 從 3.0 開始, FreeBSD 正式支援 ELF
為預設格式. 即使
a.out
格式仍然非常好, 我們編譯工具的撰寫者, GNU 的成員,
已中止了對, a.out
格式的支援. 這迫使我們維護另一份版本的
compiler 和 linker, 也使得我們不能從最新的 GNU 發展成果中獲得
好處. 此外對 ISO-C++ 的需求, 尤其是建構者和解構者, 也帶動未來
版本中對 ELF
的原生支援.