作者 | strongerHuang
微信公眾號 | 嵌入式專欄
在嵌入式軟件開發(fā)中,bin、hex、axf和elf這四種格式的文件很常見。
之前我分享的STVP、ST-LINK Utility、STM32CubeProg這些下載編程工具的時候,都用到了bin、hex格式的文章。
作為普通嵌入式軟件開發(fā)者,可能只知道如何使用他們,并不會在意這些文件里面具體是什么內(nèi)容。
bin文件只是單純的程序數(shù)據(jù),hex除程序數(shù)據(jù)之外還有一定格式數(shù)據(jù)。
而 axf 和 bin、 hex 同樣也屬于程序文件,差別在于 axf 具有更多的調(diào)試信息。
用一個表格來區(qū)分bin、hex和axf三者的關(guān)系:
bin | hex | axf |
程序數(shù)據(jù) | 程序數(shù)據(jù) | 程序數(shù)據(jù) |
|
地址、類型、校驗(yàn)等標(biāo)記信息 | 地址、類型、校驗(yàn)等標(biāo)記信息 |
|
|
調(diào)試信息 |
你會發(fā)現(xiàn),同樣一段代碼,編譯生成的bin文件最小,axf最大。
在嵌入式Linux中還有一種文件 ELF(Executable and Linkable Format,可執(zhí)行與可鏈接格式)也算是一種程序文件,這種文件包含信息更多、更復(fù)雜。
下面分別來描述bin、hex、axf和elf這四種格式文件。
當(dāng)然,bin 除了是程序文件的含義,還有其他含義,比如虛擬光驅(qū)文件,我們下載的一個 Windows 鏡像文件后綴就可能是bin。
bin 相對于hex、axf是一種最簡單的程序文件,只有程序數(shù)據(jù),程序文件有多大,程序也就多大。
因此,你下載 bin 程序文件的時候,必須要設(shè)置起始地址,比如:通過STM32 ST-LINK Utility工具下載bin文件:
而hex則不可修改(文件中包含地址信息):
1.解釋 維基百科解釋
https://en.wikipedia.org/wiki/Intel_HEX
Keil官網(wǎng)解釋
https://www.keil.com/support/docs/1584/
hex行格式:
:BBAAAATT 【D···D】CC
其中:
: 代表行開始,固定為冒號:
BB代表Bytes,數(shù)據(jù)長度
AAAA代表Address,地址
TT代表Type,數(shù)據(jù)類型(標(biāo)識)
D···D代表Date,數(shù)據(jù)
CC代表CheckSum,校驗(yàn)和
說明:
BB數(shù)據(jù)長度,也就是D···D這個字段的數(shù)據(jù)長度;
AAAA地址,起始地址、偏移地址,根據(jù)數(shù)據(jù)類型(TT)有關(guān);
TT數(shù)據(jù)類型(標(biāo)識):
-
00:數(shù)據(jù)標(biāo)識
-
01:文件結(jié)束標(biāo)識
-
02:擴(kuò)展段地址
-
04:線性地址
-
05:線性開始地址
(地址代表高16位地址,也就是要向左移16bit)
CC校驗(yàn)和計算公式:
CheckSum = 0x100 - (Sum & 0xFF)
不同數(shù)據(jù)類型個行數(shù)據(jù)略有差異,先再看下00(數(shù)據(jù)類型)的格式:
一個常見hex文件:
:020000040800F2:1000000000040020B1010008FD020008BD02000844:10001000F902000801020008350400080000000091:1000200000000000000000000000000021030008A4···省略數(shù)行:100470000000024084040008000000200004000086:040480004804000824:040000050800019955:00000001FF
1.04類型:線性地址行
:020000040800F2
02:數(shù)據(jù)長度,這里是(0800)地址的2字節(jié)長度; 0000:偏移地址,這里數(shù)據(jù)其實(shí)無效;
04:線性地址數(shù)據(jù)類型;
0800:線性起始地址,左移16位,即:0x0800 0000;
F2:校驗(yàn)和
F2 = 0x100 - (0x02 + 0x04 + 0x08);
比如,修改起始地址為0600:
2.00類型:數(shù)據(jù)行
:1000000000040020B1010008FD020008BD02000844
10:數(shù)據(jù)長度,這里是16字節(jié)(程序)數(shù)據(jù)的長度; 0000:偏移地址,數(shù)據(jù)第一行偏移0000地址,第二行就是偏移0010,第二行就是偏移0020,依次偏移到FFF0; 如果偏移到FFF0,則會重新下一個起始地址,一段程序你就明白了:
:10FFD000D0C5CFA20D0A00003052010810B50A4862:10FFE00002F0FEFC09A002F0FBFC14A002F0F8FCF9:10FFF0001EA221A123A002F0F3FC2CA002F0F0FC31:020000040801F1:10000000394802F0EDFC10BD3C5301080D0A2A20CE:1000100020202020202020202020202020202020E0:100020002020202020202020202020414756D6C7F5 00:線性地址數(shù)據(jù)類型; 00040020B1010008FD020008BD020008:程序數(shù)據(jù),就是bin文件里面的純程序數(shù)據(jù); 44:校驗(yàn)和
44 = 0x100 - (0x10 + 0x04 + 0x20 + 0xB1 + 0x01 + 0x08 + 0xFD + 0x02 + 0x08 + 0xBD + 0x02 + 0x08 + 0x44) & 0xFF;
3.01類型:文件結(jié)束行
:00000001FF
00:數(shù)據(jù)長度; 0000:偏移地址,這里數(shù)據(jù)其實(shí)無效;
01:代表文件結(jié)束;
FF:校驗(yàn)和
這里代表hex文件結(jié)束了,有些公司為了使hex傳輸(下載)更可靠,或通過工具(或命令在)結(jié)束行后面追加校驗(yàn)信息,一般遠(yuǎn)程升級會考慮更多校驗(yàn)信息(后期抽時間講述一下遠(yuǎn)程升級)。
https://www.keil.com/support/docs/1584/ https://www.kanda.com/blog/microcontrollers/intel-hex-files-explained/ (公號不支持外鏈接,請復(fù)制鏈接到瀏覽器打開)
看到這里,我相信很多人都能寫一個腳本工具,讓hex轉(zhuǎn)為bin文件(后面抽空給大家講述一下hex和bin轉(zhuǎn)換的工具)。
axf文件 axf格式文件是針對ARM編譯器的一種格式文件,它是由 ARM 編譯器產(chǎn)生。axf文件除了包含程序數(shù)據(jù)(bin)和地址(hex)等數(shù)據(jù)之外,還包含調(diào)試信息。
axf文件內(nèi)的調(diào)試信息附加在程序文件中,有助于分析和調(diào)試。
axf文件的調(diào)試信息作用:
-
可將源代碼包括注釋夾在反匯編代碼中,這樣我們可隨時切換到源代碼中進(jìn)行調(diào)試。
-
還可以對程序中的函數(shù)調(diào)用情況進(jìn)行跟蹤(通過Watch & Call Stack Window查看)。
-
對變量進(jìn)行跟蹤(利用Watch & Call Stack Window)。
當(dāng)然,axf文件調(diào)試信息的包含的內(nèi)容有限,并非所有源碼(及注釋)相關(guān)信息都會包含在其中,想要有效調(diào)試,還是需要結(jié)合源代碼工程進(jìn)行調(diào)試。
elf文件 ELF: Executable and Linkable Format,可執(zhí)行與可鏈接格式。elf是一種用于二進(jìn)制文件、可執(zhí)行文件、目標(biāo)代碼、共享庫和核心轉(zhuǎn)儲格式文件。是UNIX系統(tǒng)實(shí)驗(yàn)室(USL)作為應(yīng)用程序二進(jìn)制接口(Application Binary Interface,ABI)而開發(fā)和發(fā)布的,也是Linux的主要可執(zhí)行文件格式。 ---來源百度百科
elf文件和bin、hex、axf文件同樣屬于可執(zhí)行文件這一類,但是他們之間差異還是很大,elf文件包含的信息更多,也更復(fù)雜。
elf格式文件由四部分組成:
-
ELF header:ELF頭
-
Program header table:程序頭表
-
Section:節(jié)
-
Section header table:節(jié)頭表
ELF header: 描述整個文件的組織。
Program Header Table: 描述文件中的各種segments,用來告訴系統(tǒng)如何創(chuàng)建進(jìn)程映像的。
Section: 是從運(yùn)行的角度來描述elf文件,sections是從鏈接的角度來描述elf文件,也就是說,在鏈接階段,我們可以忽略program header table來處理此文件,在運(yùn)行階段可以忽略section header table來處理此程序(所以很多加固手段刪除了section header table)。從圖中我們也可以看出,segments與sections是包含的關(guān)系,一個segment包含若干個section。
Section Header Table: 包含了文件各個segction的屬性信息。
這四部分內(nèi)容在《ELF詳細(xì)描述》文章中有詳細(xì)描述,需要更進(jìn)一步了解,可以進(jìn)入文中了解。
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點(diǎn),不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!