2010-02-28 51 views
10

我有幾個問題:a.out?

  • 爲什麼被替換ELFa.out
  • a.out格式導致ELF文件格式升級的主要缺陷是什麼?
  • 早期的核心轉儲基於a.out,但現在它們基於ELF。 ELF提供的各種優點有哪些?
+1

你自己對此進行過研究嗎?你沒有說明你擡頭看什麼等等...... – t0mm13b 2010-02-28 19:53:57

+1

是的,我做了一些研究http://en.wikipedia.org/wiki/A.out- 「由於複雜性,Linux向ELF的過渡或多或少地被迫在該平臺上構建a.out共享庫的性質,其中包括需要在中央權威機構中註冊該庫所在的虛擬地址空間,因爲Linux中的a.out ld.so無法重新定位共享庫。由於BSD a.out格式與Linux相比更加靈活,因此各種BSD風格能夠在Linux被迫切換到ELF之後很長時間繼續使用a.out二進制文件。「 – 2010-02-28 20:06:56

回答

14

a.out格式強制共享庫佔用內存中的固定位置。如果您想分發a.out共享庫,則必須註冊其地址空間。這對性能很有好處,但它並沒有擴展。親自看看how tricky it was(linuxjournal)。相比之下,在ELF中,共享庫可以加載到內存中的任何位置,甚至可以看起來與在同一臺計算機上運行的不同應用程序的地址不同(代碼仍然只能在物理內存中的一個地方有效加載)!爲了實現這一點,在IA-32架構中,必須犧牲一個寄存器(%ebx)。顯示共享庫在ELF中變得更加複雜,但這是編譯器端的複雜性,而不是程序員端。

+0

我會同時知道如何使用ebx之前和之後,以及什麼coff做與elf不同的是 – 2018-02-28 04:56:33

+0

@EvanCarroll原來的問題根本不涉及COFF。您的評論聽起來像是一個新問題,我請您提問。 – 2018-02-28 08:00:42

+0

@EvanCarroll在a.out中,ebx可用作用戶代碼作爲通用寄存器。在x86(32位)ELF ABI中,ebx保存全局偏移表(GOT)的地址,以便它不可用於用戶代碼。葉函數 - 不調用任何其他函數的函數 - 可以保存並使用它,但與被調用程序保存寄存器不同,將它保存到入口以便能夠使用它通常是不夠的。 – 2018-02-28 08:09:39

0

我記得,a.out格式的原始問題之一是它只支持三個部分:文本,數據和bss。 ELF允許任何數量(或至少更多)。 out的頭部格式很簡單,類似:

word <magic> 
word <text size> 
word <data size> 
word <bss size> 

ELF格式,相反,有部分頭文件,名稱,大小等

有更多的部分允許標準節,而且如果我們需要的話,還可以爲我們提供const節,構造函數節,甚至每個函數一節。

+1

這解釋了這些差異,但並未解釋a.out出了什麼問題或爲什麼有更多的段落更好 – 2010-02-28 20:09:00

1

有點瑣碎--a.out代表彙編器輸出,直到今天,gcc將編譯C代碼並默認命名輸出文件a.out,除非指定了另一個輸出名稱,儘管輸出文件仍然是ELF。這是從代碼被直接轉換爲彙編輸出的日子中保留下來的......很高興看到傳統的精神生活!

希望這會有所幫助, 最好的問候, 湯姆。

+3

請注意,雖然gcc默認使用名稱「a.out」,但格式仍然是ELF。 – hlovdal 2010-02-28 20:40:32

+0

@hlovdal:true! :) – t0mm13b 2010-02-28 21:06:58

+0

誰downvoted這個?顯然,downvoter不明白!請留下評論...並不要盲目downvoting和*不*發表評論! – t0mm13b 2010-05-15 10:55:14

相關問題