1. 程式人生 > >.axf /.hex/.bin/.elf檔案型別的區別

.axf /.hex/.bin/.elf檔案型別的區別

一般bin、hex被稱為映象檔案,即可執行檔案,直接燒寫到flash或記憶體中即可執行。

而axf是arm的除錯檔案,一般在針對arm除錯過程中使用的檔案, 不過通過專門工具也能直接將其中的真正程式碼部分(即axf中除了前後除錯部分資訊外的部分)燒寫到flash中。 所以,有時候axf也稱為映象檔案。

1).axf檔案=除錯資訊+.bin檔案

Axf檔案由ARM編譯器產生,除了

包含bin的內容之外,還附加其他除錯資訊, 這些除錯資訊加在可執行的二進位制資料之前。 除錯時這些除錯資訊不會下載到RAM中,真正下載到RAM中的資訊僅僅是可執行程式碼。 因此,如果ram的大小小於axf檔案的大小,程式是完全有可能在ram中除錯的, 只要axf除去除錯資訊後文件大小小於ram的大小即可。

除錯資訊有以下作用: 1.可將原始碼包括註釋夾在反彙編程式碼中,這樣我們可隨時切換到原始碼中進行除錯。 2.我們還可以對程式中的函式呼叫情況進行跟蹤(通過Watch & Call StackWindow檢視)。 3.對變數進行跟蹤(利用Watch & Call Stack Window)。

除錯資訊雖然有用,但程式功能實現後,在目標檔案和庫中減少除錯資訊卻是非常有益的。 減少除錯資訊可減少目標檔案和庫大小、加快連結速度、減小最終鏡象程式碼。 以下幾種方法可用來減少每個原始檔產生的除錯資訊: 1.避免在標頭檔案中條件性使用#define,連結器不能移除共用的除錯部分,除非這些部分是完全一樣的。 2.更改C/C++原始檔,使#included包含的所有標頭檔案有相同順序。 3.儘量使用數量較多的小標頭檔案而不是較大的單一標頭檔案,這有利於連結器獲取更多的通用塊。 4.程式中最好只包含必須用到的標頭檔案。避免重複包含標頭檔案,可使用編譯器選項–remarks來產生警告資訊;

2).bin檔案 真正的二進位制檔案,未新增任何其他資訊。最純粹的二進位制機器程式碼,沒有格式,檔案的大小就是包括的資料的實際大小

3).hex檔案(十六進位制的英文名稱:Hexadecimal)

指的是Intel標準的十六進位制檔案,並且是用一定檔案格式的可列印的ASCII碼來表示二進位制的數值。 hex檔案經常被用於將程式或資料傳輸儲存到ROM、EPROM,大多數程式設計器和模擬器都使用HEX檔案。

HEX檔案都是由記錄(RECORD)組成的。 在HEX檔案裡面,兩個16進位制數字代表一個位元組,每一行代表一個HEX記錄,記錄的基本格式為: +—————————————————————+ | RECORD | RECLEN | LOAD | RECTYPE | INFO or DATA| CHKSUM | | MARK ‘:’ | | OFFSET | | | | +—————————————————————+ | 1-byte | 1-byte | 2-byte | 1-byte | n-byte | 1-byte | +—————————————————————+ 注:1-byte:2個字元 2-byte:4個字元

     記錄型別包括:
     '00' DataRrecord:用來記錄資料,HEX檔案的大部分記錄都是資料記錄

     '01' End of File Record:用來標識檔案結束,放在檔案的最後,標識HEX檔案的結尾

     '02' Extended Segment AddressRecord: 用來標識擴充套件段地址的記錄

     '04' Extended Linear AddressRecord: 用來標識擴充套件線性地址的記錄

    在上面的後2種記錄,都是用來提供地址資訊的。每次碰到這2個記錄的時候,都可以根據記錄計算出一個“基”地址。
    對於每行後面的資料記錄,計算地址的時候,都是以這些“基”地址為基礎的。

以行為單位,每行由“:”(0x3a)開始,以回車鍵結束(0x0d,0x0a)(Windows下檔案都是如此,隱藏不顯示)。 對於16位的地址,則高位在前低位在後,比如地址0x010a,在HEX格式檔案中就表示為字串”010a”。

舉例;完整的一個.hex檔案: :02 0000 04 0000 FA :10 0000 00 18F09FE518F09FE518F09FE518F09FE5 C0 :10 0010 00 18F09FE5805F20B9F0FF1FE518F09FE5 1D :10 0020 00 F00000004000000044000000A0000000 BC :10 0030 00 A40000000000000000000000A8000000 74 :10 0040 00 FEFFFFEA040050E300F19F370EF0B0E1 3D :10 0050 00 60000000700000008000000090000000 C0 :10 0060 00 00004FE1800080E300F061E10EF0B0E1 BC ……. :10 FFF0 00 B000DDE142C1FFEB021080E3B000DDE1 C3 :02 0000 04 0001 F9 :10 0000 00 89C1FFEBB000DDE1010080E23CC1FFEB 04 :10 0010 00 021080E3B000DDE1010080E282C1FFEB 6D :10 0020 00 0000D5E5800CB0E10200005A900C84E2 9B :10 0030 00 B000CDE1010000EA920C84E2B000CDE1 15 :10 0040 00 B000DDE12EC1FFEB021080E3B000DDE1 86 :10 0050 00 75C1FFEBB000DDE1010080E228C1FFEB DC ……. :10 FFE0 00 34870100588701002530326400000000 8A :10 FFF0 00 256400001887010048870100F04F2DE9 B3 :02 0000 04 0002 F8 :10 0000 00 3CD04DE20100A0E320008DE57C021FE5 1D :10 0010 00 80621FE52490D0E5040196E51C4F9FE5 22 :10 0020 00 80821FE5187F9FE50050A0E1E5AF00EB 5F …….

:10 FFE0 00 76F8FFEA81F3FFEB5C00D8E5C00000E2 A1 :10 FFF0 00 040080E35C00C8E50000DBE5040080E3 6A :02 0000 040003 F7 :10 0000 000000CBE52870C8E56CF8FFEA020050E3 79 :10 0010 000100000A010050E30100001A30F3FFEB 79 :10 0020 0066F8FFEA47F1FFEB64F8FFEA020050E3 ED :10 0030 000100000A010050E30100001A41F1FFEB 4A …….

:10 FFE0 002700A0E30A0000EA00069FE50C0086E5 72 :10 FFF0 000E00A0E3060000EAF4059FE50C0086E5 8C :02 0000 040004 F6 :10 0000 000400A0E3020000EAFF00A0E3000000EA 11 :10 0010 00FF00A0E30310D6E5000051E10000009A C4 :10 0020 000300C6E50300D6E5080050E30000003A EF …….

:10 FFE0 00380003003C003900030041003B000300 DF :10 FFF0 0046003C0003004B003D00030050003E00 63 :02 0000 040005 F5 :10 0000 00030055003F0003005A00400003005F00 5A :10 0010 0041000300640042000300690043000300 44 :10 0020 006E004400030073004400030078004500 A4 ……..

:10 FFE0 00393A3A3B3C3D3D3E3F3F404142424344 2B :10 FFF0 004445454647474848494A4A4B4B4C4D4D 76 :02 0000 040006 F4 :10 0000 004E4E4F4F505051515252535354545555 D8 :10 0010 0056565757585859595A5A5A5B5B5C5C5D 4B :10 0020 005D5D5E5E5F5F60606061616262626363 CE ……..

:10 FFE0 0000000000000000000000000000000000 11 :10 FFF0 0000000000000000000000000000000000 01 :02 0000 040007 F3 :10 0000 0000000000000000000000000000000000 F0 :10 0010 0000000000007FFC000000000001C00600 9E :10 0020 000000000006000380000000001803E0C0 8C ……..

:10 C910 00C8BB0600FFFFFFFFFFFF080000600040 EC :10 C920 000064004000680040ABBC0700B3BC0700 D7 :00 0000 01 FF

下面取HEX檔案中的一行:

:10 0000 00 [18 F0 9F E5 18 F0 9F E5 18 F0 9F E5 18 F0 9F E5]C0

“:”[0]: 表示一行的開始。

“:”後的第1,2個字元[1:2]: 表示本行包含的資料的長度,這裡”10”就是0x10即16個。

“:”後的第3,4,5,6個字元[3:6]: 表示資料儲存的起始地址, “0000”這裡表示從0x0000地址開始儲存16個數據,其中高位地址在前,低位地址在後。

“:”後的第7,8個字元[7:8]:表示資料的型別。 該型別總共有以下幾種: 00 —-資料記錄 01 —-檔案結束記錄 02 —-擴充套件段地址記錄 04 —-擴充套件線性地址記錄

這裡就是0x00即為普通資料記錄。

自後的32個字元: 表示本行包含的資料,每兩個字元表示一個位元組資料,總共有16個位元組資料,跟行首的記錄的長度相一致。

最後兩個字元:表示校驗碼。

:00 0000 01 FF:每個HEX格式的檔案的最後一行都固定為該行內容,01表示檔案內容的結束。

4)ELF(Executable and Linking Format):是一種物件檔案的格式 ELF檔案型別: (三種) a)可重定位檔案:使用者和其他目標檔案一起建立可執行檔案或者共享目標檔案,例如lib*.a檔案。 b)可執行檔案:用於生成程序映像,載入記憶體執行,例如編譯好的可執行檔案a.out。 c)共享目標檔案:用於和其他共享目標檔案或者可重定位檔案一起生成elf目標檔案或者和執行檔案一起建立程序映像,例如lib*.so檔案。

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

2)axf/elf是帶格式的映象,bin是直接的記憶體映象的表示。 3) Linux OS下,ELF通常就是可執行檔案,通常gcc -o testtest.c,生成的test檔案就是ELF格式的, 在Linux Shell下輸入./test就可以執行。

在Embedded中,上電開始執行,沒有OS系統,如果將ELF格式的檔案燒寫進去,包含一些ELF格式的東西, arm執行碰到這些指令,就會導致失敗,如果用bin檔案,程式就可以一步一步執行

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