當前位置:首頁 > 公眾號精選 > 小麥大叔
[導讀]點擊上方“小麥大叔”,選擇“置頂/星標公眾號”福利干貨,第一時間送達大家好,我是小麥,之前有個朋友在群里問到.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 ——



本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
關閉
關閉