2010-03-11 29 views
71

由complier生成的最終圖像包含bin文件和擴展加載程序格式ELf文件,兩者之間有什麼區別,特別是ELF文件的實用性。ELF文件和bin文件有什麼區別?

+0

[這是NASM必須說的](http://www.nasm.us/doc/nasmdoc7.html#section-7.1)。不是ARM特定的,但可能是相同的概念。例如,如果你編譯的文件只包含沒有'-f'(或'-fbin')的'NOP',它就會編譯成單個字節'0x90',而不是帶有'-felf32'的400字節ELF容器。所以只需要原始代碼,不需要容器元數據。 NASM稱它主要用於MS-DOS .COM和[.SYS](https://en.wikipedia.org/wiki/.sys)文件。 'section'指令大多被忽略,只會產生對齊。 – 2015-04-29 09:54:31

+0

這是bin文件有用的一種方式:使引導扇區部署操作系統:http:// stackoverflow。com/a/32483545/895245 – 2015-09-17 17:57:14

回答

71

Bin文件是一個純粹的二進制文件,沒有內存修改或重定位,很可能它有明確的指令要加載到特定的內存地址。鑑於......

ELF文件是可執行的可鏈接格式,它由符號查找和可重定位表組成,也就是說,它可以由內核加載到任何內存地址,並自動調整所有使用的符號到從它加載到的內存地址的偏移量。通常,ELF文件有很多部分,比如'data','text','bss'等等,它們在運行時可以計算出哪裏調整符號的內存引用的地方動態運行時。

+0

「很可能它有明確的指令要加載到特定的內存地址」:這是否意味着bin文件生成過程會添加額外的代碼來將數據加載到特定地址? – xiaobai 2014-05-28 14:44:21

+1

據我所知,bin文件就像運行偏移量爲0的程序並且數據段被嵌入其中一樣。如果這是錯誤的,請糾正我。 – 2015-04-09 01:26:15

+0

@MartinKersten正確,bin文件從偏移量0開始。 – t0mm13b 2015-06-01 00:37:04

21

一些資源:

  1. ELF針對ARM架構
    http://infocenter.arm.com/help/topic/com.arm.doc.ihi0044d/IHI0044D_aaelf.pdf
  2. ELF從維基
    http://en.wikipedia.org/wiki/Executable_and_Linkable_Format

ELF格式通常是編譯的默認輸出。

arm-elf-objcopy -O binary [elf-input-file] [binary-output-file] 

或使用fromELF實用程序(建於大多數IDE如ADS雖然): 如果你使用GNU工具鏈,可以將它通過使用objcopy命令,如轉換爲二進制格式

fromelf -bin -o [binary-output-file] [elf-input-file] 
+1

-1。這並不回答有關bin文件是什麼的問題。 – xiaobai 2014-05-28 14:31:05

+6

這是在bin文件詳細信息被回答後添加的,而* does *附加了一個實際有用的技術。 +1。 – erbdex 2015-05-31 23:48:52

26

bin文件只是進入ROM的位和字節,或者將運行程序的特定地址。你可以直接獲取這些數據並直接加載它,你需要知道基地址是什麼,因爲通常不在那裏。

一個elf文件包含bin信息,但它被許多其他信息包圍,可能的調試信息,符號可以區分二進制數據中的代碼和數據。允許多個二進制數據塊(當你將其中的一個轉儲到一個bin中時,你會得到一個帶有填充數據的大bin文件將它填充到下一個塊)。告訴你你有多少二進制文件,以及有多少bss數據需要初始化爲零(gnu工具在正確創建bin文件時有問題)。

elf文件格式是一種標準,arm發佈其標準的增強/變體。我建議每個人都寫一個elf解析程序來理解它裏面的內容,不要去打擾一個庫,只是使用規範中的信息和結構非常簡單。幫助克服gnu問題,一般創建.bin文件,以及調試鏈接器腳本和其他可以幫助搞亂bin或elf輸出的東西。

相關問題