在黑暗的過去, 只有簡單的硬體. 簡單的硬體支援小型、簡單的系統. a.out 在簡單的系統上勝任愉快 (PDP-11). 當 unix 移植到其他平台時, a.out 保留了下來, 因為對早期的 Motorola 68K, VAX 之類的架構已經 夠用了.
然後有些硬體工程師覺得讓軟體多做點事, 那 CPU 的電晶體就能少
一點而跑的更快. 要在這種新式硬體上工作(現在稱為RISC), a.out
就
不適合了, 所以需多的格式就發展出來以提供比受限、簡單的a.out
更
好的效能. 像是 COFF
, ECOFF
, 以及一些不有名的格式, 每一種
都有限制直到 ELF
.
此外, 當程式越來越大兒磁碟(以及主記憶體)相對來說較小時, 共享
程式庫的概念就發展出來了. 虛擬記憶體系統也變得越來越精巧. 當每一
種進步都在 a.out
上完成時, 它的可用性也越來越低. 另外, 人們
還有在執行時期可以動態載入, 或是丟棄執行過的初始化程式以節省記憶
體. 程式語言也變得更精巧而且人們想要在在 main 之前執行別的程式碼
. 許多繁雜的技巧用在 a.out
上以解決這些問題. a.out
要
解決這些問題需要越來越多額外的負擔和複雜度. 當 ELF
輕易的解
決這些問題, 從基本上可以工作的系統轉換卻很痛苦. 所以ELF
要
等到維護 a.out
比轉換到 ELF
還痛苦.
然而, 隨著時間過去, FreeBSD 的 build tools 形成了平行的兩支
(尤其是組譯器和 loader). FreeBSD 這支加進了共享程式庫以及修正
了一些錯誤. GNU 原來撰寫這些程式的人則重寫了這些程式, 並加入了
對於跨平台編譯, 不同格式模組之類的東西更簡單的支援. 許多人想要
做出以 FreeBSD 為目的平台的跨平台編譯器, 不幸的是 FreeBSD 的 as
和 ld 不能做這項工作. 新的 GNU 工具(binutils) 加入了跨平台編譯、
ELF
、共享程式庫、C++ 擴充, 等等. 此外, 許多廠商以 ELF
格
式發行產品, 而能夠在 FreeBSD 上跑的話當然很好. 而且如果能跑 ELF
格式的執行檔, 為甚麼還要理 a.out
? 牠是一匹又累又老的馬, 過
去非常有用, 但是時後讓牠退休了.
ELF
比 a.out 更應有表達力(expressive?)而且具有更多的
擴充性. ELF
工具維護的比較好, 而且提供跨平台編譯的支援,
這對許多人來說是很重要的. ELF
可能比 a.out 慢一點, 但差異
非常難測量出來. 這兩者之間還有許多細節上的不同, 例如分頁的對應
方式, 初始化程式碼的作法等等. 這些並不是很重要, 但就是不同. 在
以後 GENERIC 核心不會支媛 a.out
, 當不在有執行傳統 a.out
程式的需要時, 會從核心移除.