天天看點

BIN、HEX,ELF,AXF檔案的差別

1.Bin

Bin檔案是最純粹的二進制機器代碼, 或者說是"順序格式"。按照assembly code順序翻譯成binary machine code,内部沒有位址标記。Bin是直接的記憶體映象表示,二進制檔案大小即為檔案所包含的資料的實際大小。 BIN檔案就是直接的二進制檔案,一般用程式設計器燒寫時從00開始,而如果下載下傳運作,則下載下傳到編譯時的位址即可。可以直接在裸機上運作。

2.Hex

Intel hex 檔案常用來儲存單片機或其他處理器的目标程式代碼。它儲存實體程式存儲區中的目标代碼映象。一般的程式設計器都支援這種格式。 就是機器代碼的十六進制形式,并且是用一定檔案格式的ASCII碼來表示。

HEX檔案由記錄(RECORD)組成。在HEX檔案裡面,每一行代表一個記錄。每條記錄都由一個冒号“:”打頭,其格式如下:

:BBAAAATTHHHH...HHHHCC

BB:位元組個數。

AAAA:資料記錄的開始位址,高位在前,低位在後。

TT: Type

00資料記錄,用來記錄資料。

01記錄結束,放在檔案末尾,用來辨別檔案結束。

02用來辨別擴充段位址的記錄

04擴充位址記錄(表示32位位址的字首)

HHHH:一個字(Word)的資料記錄,高位元組在前,低位元組在後。TT之後共有 BB/2 個字的資料 。

CC: 占據一個Byte的CheckSum

舉例分析:

:020000040000FA

:10000400FF00A0E314209FE5001092E5011092E5A3

:00000001FF

分析如下:

第1條記錄長度為0x02,LOAD OFFSET為0000,RECTYPE為04,說明該記錄為擴充段位址記錄。資料為0000,校驗和為FA。從這個記錄的長度和資料,我們可以計算出基位址為0X0000。後面的資料記錄都以此位址為基位址。

第2條記錄長度為0x10(16),LOAD OFFSET為0004,RECTYPE為00,說明該記錄為資料記錄。資料為FF00A0E314209FE5001092E5011092E5,共16個位元組,記錄的校驗和為A3。此時的基位址為0X0000,加上OFFSET,這個記錄裡的16BYTE的資料的起始位址就是0x0000 + 0x0004 = 0x0004. 其實際的資料隻有16個BYTE:FF00A0E314209FE5001092E5011092E5。

第3條記錄的長度為00,LOAD OFFSET為0000,TYPE= 01,校驗和為FF。類型為01,說明這個是一個END OF FILE RECORD,辨別檔案的結尾。HEX結束符一般以:00000001FF結尾。

簡單總結一下這2種檔案格式的差別:

1、HEX檔案包含位址資訊而BIN檔案隻包含資料本身,燒寫或下載下傳HEX檔案時,一般不需要使用者指定位址,因為HEX檔案内部已經包含了位址資訊。燒寫BIN檔案時則需要使用者指定燒錄的位址資訊。

2、HEX檔案是用ASCII碼來表示二進制的數值。例如8-BIT的二進制數值0x4E,用ASCII來表示就需要分别表示字元‘4’和字元‘E’,每個字元均需要一個位元組,是以HEX檔案至少需要2倍BIN檔案的空間。

3.ELF

ELF(Executableand linking format)檔案是x86 Linux系統下的一種常用目标檔案(objectfile)格式,有三種主要類型:

(1)适于連接配接的可重定位檔案(relocatablefile),可與其它目标檔案一起建立可執行檔案和共享目标檔案。

(2)适于執行的可執行檔案(executable file),用于提供程式的程序映像,加載到記憶體執行。

(3)共享目标檔案(shared object file),連接配接器可将它與其它可重定位檔案和共享目标檔案連接配接成其它的目标檔案,動态連接配接器又可将它與可執行檔案和其它共享目标檔案結合起來建立一個程序映像。 

小結:可由elf檔案轉化為hex和bin兩種檔案,hex也可以直接轉換為bin檔案,但是bin要轉化為hex檔案必須要給定一個基位址。而hex和bin不能轉化為elf檔案,因為elf的資訊量要大。Axf檔案可以轉化為bin檔案,KEIL下可用以下指令fromelf -nodebug xx.axf -bin xx.bin即可。

4.AXF

Axf檔案由ARM編譯器産生,除了包含bin的内容之外,還附加其他調試資訊,這些調試資訊加在可執行的二進制資料之前。調試時這些調試資訊不會下載下傳到RAM中,真正下載下傳到RAM中的資訊僅僅是可執行代碼。是以,如果ram的大小小于axf檔案的大小,程式是完全有可能在ram中調試的,隻要axf除去調試資訊後檔案大小小于ram的大小即可。

調試資訊有以下功用:

1、 可将源代碼包括注釋夾在反彙編代碼中,這樣我們可随時切換到源代碼中進行調試。

2、 我們還可以對程式中的函數調用情況進行跟蹤(通過Watch & Call Stack Window檢視)。

3、對變量進行跟蹤(利用Watch & Call Stack Window)。

調試資訊雖然有用,但程式功能實作後,在目标檔案和庫中減少調試資訊卻是非常有益的。減少調試資訊可減少目标檔案和庫大小、加快連結速度、減小最終鏡象代碼。以下幾種方法可用來減少每個源檔案産生的調試資訊:

1、避免在頭檔案中條件性使用#define,連結器不能移除共用的調試部分,除非這些部分是完全一樣的。

2、更改C/C++源檔案,使#included包含的所有頭檔案有相同順序。

3、盡量使用數量較多的小頭檔案而不是較大的單一頭檔案,這有利于連結器擷取更多的通用塊。

4、程式中最好隻包含必須用到的頭檔案。避免重複包含頭檔案,可使用編譯器選項--remarks來産生警告資訊;

注意:

(1)axf和elf都是編譯器生成的可執行檔案。差別是:ADS編譯出來的是AXF檔案。gcc編譯出來的是ELF檔案。兩者雖然很像,但還是有差别的。這是檔案格式的差别,不涉及調試格式。

(2)axf/elf是帶格式的映象,bin是直接的記憶體映象的表示。

(3)Linux OS下,ELF通常就是可執行檔案,通常gcc -o test test.c,生成的test檔案就是ELF格式的,在Linux Shell下輸入./test就可以執行。在Embedded中,上電開始運作,沒有OS系統,如果将ELF格式的檔案燒寫進去,包含一些ELF格式的東西,arm運作碰到這些指令,就會導緻失敗,如果用bin檔案,程式就可以一步一步運作。

是以:HEX和bin檔案可以在裸機上運作,而ELF檔案是在有OS的環境中運作的。

————————————————

版權聲明:本文為CSDN部落客「p.c.wang」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。

原文連結:https://blog.csdn.net/chun_1959/article/details/43731937