基礎很重要!elf和map文件有不同?
時間:2021-11-03 14:52:38
手機看文章
掃描二維碼
隨時隨地手機看文章
[導讀]點擊上方“小麥大叔”,選擇“置頂/星標公眾號”福利干貨,第一時間送達大家好,我是小麥,之前有個朋友在群里問到.map和.elf文件分別起什么作用?雖然是比較基礎的問題,但是一時間我也沒有答上來了,于是就簡單地整理這方面的問題,下面簡單復習一下。事情的起因在做MCU開發(fā)的過程中,我...
.map和.elf文件分別起什么作用?雖然是比較基礎的問題,但是一時間我也沒有答上來了,于是就簡單地整理這方面的問題,下面簡單復習一下。
事情的起因在做MCU開發(fā)的過程中,我們以Keil MDK為例簡單介紹一下,通常我們會看到一些后綴的文件名,比如.bin文件,.hex文件,.axf文件,.map文件,.elf文件,當然還有很多其他的文件,這里我們先簡單介紹一下,先說.elf吧。
.bin
bin文件就是二進制文件,完全有0和1組成;當然了,所有的文件最終的本質都是0和1,不過這里的bin文件應該面向機器的文件了,機器可以讀懂它,而人很難讀懂。我們所熟悉的文本文件,是通過多種編碼格式,將信息以一種可讀的形式展現(xiàn)給我們,而這些信息最終的本質,還是二進制。
下面我使用Linux上的一個指令hexdump,查看二進制文件;
hexdump -C flash_rdp.bin
bin文件這里的工具展示給我們的內容:
-
左邊的是地址;
flash_rdp.bin文件大小是 11256 個字節(jié);
文件大小這里地址到0x2bf8就是11256的十六進制形式;
-
中間是bin文件的十六進制內容形式;
-
右邊則是我們人類可以看懂的文本格式,通常代碼中定義的字符串,都可以在這里找到,比如圖片中的dafaultTask就是我在代碼中定義的一個任務的名稱;
OK,那bin文件是如何生成的呢?我們下面來繼續(xù)介紹一下吧。再講講elf文件格式。
.elf
elf是(Executable File Format)的縮寫,顧名思義就是可執(zhí)行文件格式。這種格式的通用性很強。
可以追溯到coff文件規(guī)范,coff是Unix系統(tǒng)實驗室首先提出并且使用的文件規(guī)范,后來,微軟基于coff格式制定了PE格式標準,并用于當時的Windows系統(tǒng)。
后來,Unix實驗室在coff的基礎上重新發(fā)布了新的格式,也就是現(xiàn)在使用很廣泛的elf格式,作為應用程序二進制接口 Application Binary Interface(ABI)。
由于elf文件具有通用性強的優(yōu)點,現(xiàn)在流行的開發(fā)模式是:先通過編譯工具生成ELF文件格式的可執(zhí)行文件,在使用外部工具,抽離出elf文件中的相應部分,生成bin文件。
著名的gnu、bootloader、U-Boot就采用了這種做法。例如:
-
編譯器工具集gcc的bin生成工具是elf2bin。
-
ARM公司雖然使用的是自家的armcc編譯器,但是也提供了fromelf工具來實現(xiàn)上面的方式。
使用gcc 編譯出來的是ELF文件。
gcc –o test test.c
然后生成的test文件就是elf格式的,在linux shell下輸入 ./test就可以執(zhí)行。
還可以通過指令,查看elf的頭部;
readelf -h test
elf header上面說了,armcc編譯出來的文件顯然也是遵守elf格式的,我們也用readelf簡單看一下它的頭部;
文件列表我把.axf拷貝到虛擬機上,使用readelf看了一下elf header,確實是32位的ARM平臺,所以這里的axf文件。
device下面我看了一下KEIL MDK安裝路徑下的armcc工具鏈,這里有一個fromelf.exe通過這個工具,我們可以將axf文件轉換成bin文件;也就是二進制文件;
fromelf使用指令;
fromelf.exe .\flash_rdp.axf --bin --output .\flash_rdp.bin
這樣就生成了bin文件,可以通過flash工具,直接燒錄bin文件到芯片上,比如使用jlink的flash tool可以直接燒bin文件到芯片的內部flash中。
而axf文件,可以通過icp的方式燒錄到芯片中。
到這里,elf和axf文件差不多介紹了一下,但是elf格式內容還是比較多的,可以參考相應的資料;下面簡單講講.map文件
.map
在介紹map文件之前,我們先回顧一下程序編譯的幾個階段;
-
預編譯階段:又稱為預處理階段,對代碼做一些文本上的替換工作;
-
編譯階段:源文件
C files和匯編文件Assembly files被編譯器生成.o文件;
-
鏈接階段:.o文件通過鏈接器armlink生成 elf格式的文件;
armcc的整個構建過程如下圖所示;
構建過程其中,map文件就在鏈接階段產生,這里我們先打開一個 .map文件看一下,看看里面都有些什么,如下圖所示;
map文件細節(jié)所以map文件就詳細地向我們展示了,源代碼被工具鏈構建之后的詳細信息,包括固件大小,函數(shù)符號,內存映射,等等,這里就不詳細介紹;
另外hex之前寫過一篇文件詳細介紹過,但是感覺不用太在意。
summary
簡單介紹了使用arm工具鏈在構建過程中所產生的幾種文件類型,包括,bin文件,hex文件,axf文件,elf格式,map文件等等,由于作者能力水平有限,文章難免存在錯誤,請不吝賜教。
如果文章幫助了你,請幫忙三連鼓勵。
—— The End ——