Frequently Asked Questions for FreeBSD 2.X : 其它各式各樣的問題 : 好吧, 但為甚麼會有這麼多種不同的格式?
Previous: 為甚麼要用(甚麼是) a.out 和 ELF 執行檔格式?
Next: 為甚麼 chmod 不會改變符號連結(symlink)的存取權限?

12.3. 好吧, 但為甚麼會有這麼多種不同的格式?

在黑暗的過去, 只有簡單的硬體. 簡單的硬體支援小型、簡單的系統. 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 程式的需要時, 會從核心移除.


Frequently Asked Questions for FreeBSD 2.X : 其它各式各樣的問題 : 好吧, 但為甚麼會有這麼多種不同的格式?
Previous: 為甚麼要用(甚麼是) a.out 和 ELF 執行檔格式?
Next: 為甚麼 chmod 不會改變符號連結(symlink)的存取權限?