www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > 小麥大叔
[導(dǎo)讀]點(diǎn)擊上方“小麥大叔”,選擇“置頂/星標(biāo)公眾號(hào)”福利干貨,第一時(shí)間送達(dá)大家好,我是小麥,之前有個(gè)朋友在群里問(wèn)到.map和.elf文件分別起什么作用?雖然是比較基礎(chǔ)的問(wèn)題,但是一時(shí)間我也沒(méi)有答上來(lái)了,于是就簡(jiǎn)單地整理這方面的問(wèn)題,下面簡(jiǎn)單復(fù)習(xí)一下。事情的起因在做MCU開(kāi)發(fā)的過(guò)程中,我...





大家好,我是小麥,之前有個(gè)朋友在群里問(wèn)到.map和.elf文件分別起什么作用?雖然是比較基礎(chǔ)的問(wèn)題,但是一時(shí)間我也沒(méi)有答上來(lái)了,于是就簡(jiǎn)單地整理這方面的問(wèn)題,下面簡(jiǎn)單復(fù)習(xí)一下。


事情的起因在做MCU開(kāi)發(fā)的過(guò)程中,我們以Keil MDK為例簡(jiǎn)單介紹一下,通常我們會(huì)看到一些后綴的文件名,比如.bin文件,.hex文件,.axf文件,.map文件,.elf文件,當(dāng)然還有很多其他的文件,這里我們先簡(jiǎn)單介紹一下,先說(shuō).elf吧。


.bin

bin文件就是二進(jìn)制文件,完全有0和1組成;當(dāng)然了,所有的文件最終的本質(zhì)都是0和1,不過(guò)這里的bin文件應(yīng)該面向機(jī)器的文件了,機(jī)器可以讀懂它,而人很難讀懂。我們所熟悉的文本文件,是通過(guò)多種編碼格式,將信息以一種可讀的形式展現(xiàn)給我們,而這些信息最終的本質(zhì),還是二進(jìn)制。


下面我使用Linux上的一個(gè)指令hexdump,查看二進(jìn)制文件;


hexdump -C flash_rdp.bin
bin文件這里的工具展示給我們的內(nèi)容:


  • 左邊的是地址;flash_rdp.bin文件大小是 11256 個(gè)字節(jié);


    文件大小這里地址到0x2bf8就是11256的十六進(jìn)制形式;


  • 中間是bin文件的十六進(jìn)制內(nèi)容形式;


  • 右邊則是我們?nèi)祟?lèi)可以看懂的文本格式,通常代碼中定義的字符串,都可以在這里找到,比如圖片中的dafaultTask就是我在代碼中定義的一個(gè)任務(wù)的名稱(chēng);


OK,那bin文件是如何生成的呢?我們下面來(lái)繼續(xù)介紹一下吧。再講講elf文件格式。


.elf

elf是(Executable File Format)的縮寫(xiě),顧名思義就是可執(zhí)行文件格式。這種格式的通用性很強(qiáng)。


可以追溯到coff文件規(guī)范,coff是Unix系統(tǒng)實(shí)驗(yàn)室首先提出并且使用的文件規(guī)范,后來(lái),微軟基于coff格式制定了PE格式標(biāo)準(zhǔn),并用于當(dāng)時(shí)的Windows系統(tǒng)。


后來(lái),Unix實(shí)驗(yàn)室在coff的基礎(chǔ)上重新發(fā)布了新的格式,也就是現(xiàn)在使用很廣泛的elf格式,作為應(yīng)用程序二進(jìn)制接口 Application Binary Interface(ABI)。


由于elf文件具有通用性強(qiáng)的優(yōu)點(diǎn),現(xiàn)在流行的開(kāi)發(fā)模式是:先通過(guò)編譯工具生成ELF文件格式的可執(zhí)行文件,在使用外部工具,抽離出elf文件中的相應(yīng)部分,生成bin文件。


著名的gnu、bootloader、U-Boot就采用了這種做法。例如:


  • 編譯器工具集gcc的bin生成工具是elf2bin。
  • ARM公司雖然使用的是自家的armcc編譯器,但是也提供了fromelf工具來(lái)實(shí)現(xiàn)上面的方式。
使用gcc 編譯出來(lái)的是ELF文件。


gcc –o test test.c
然后生成的test文件就是elf格式的,在linux shell下輸入 ./test就可以執(zhí)行。


還可以通過(guò)指令,查看elf的頭部;


readelf -h test
elf header上面說(shuō)了,armcc編譯出來(lái)的文件顯然也是遵守elf格式的,我們也用readelf簡(jiǎn)單看一下它的頭部;


文件列表我把.axf拷貝到虛擬機(jī)上,使用readelf看了一下elf header,確實(shí)是32位的ARM平臺(tái),所以這里的axf文件。


device下面我看了一下KEIL MDK安裝路徑下的armcc工具鏈,這里有一個(gè)fromelf.exe通過(guò)這個(gè)工具,我們可以將axf文件轉(zhuǎn)換成bin文件;也就是二進(jìn)制文件;


fromelf使用指令;


fromelf.exe .\flash_rdp.axf --bin --output .\flash_rdp.bin
這樣就生成了bin文件,可以通過(guò)flash工具,直接燒錄bin文件到芯片上,比如使用jlink的flash tool可以直接燒bin文件到芯片的內(nèi)部flash中。


而axf文件,可以通過(guò)icp的方式燒錄到芯片中。


到這里,elf和axf文件差不多介紹了一下,但是elf格式內(nèi)容還是比較多的,可以參考相應(yīng)的資料;下面簡(jiǎn)單講講.map文件


.map

在介紹map文件之前,我們先回顧一下程序編譯的幾個(gè)階段;


  • 預(yù)編譯階段:又稱(chēng)為預(yù)處理階段,對(duì)代碼做一些文本上的替換工作;


  • 編譯階段:源文件C files和匯編文件Assembly files被編譯器生成.o文件;


  • 鏈接階段:.o文件通過(guò)鏈接器armlink生成 elf格式的文件;


armcc的整個(gè)構(gòu)建過(guò)程如下圖所示;


構(gòu)建過(guò)程其中,map文件就在鏈接階段產(chǎn)生,這里我們先打開(kāi)一個(gè) .map文件看一下,看看里面都有些什么,如下圖所示;


map文件細(xì)節(jié)所以map文件就詳細(xì)地向我們展示了,源代碼被工具鏈構(gòu)建之后的詳細(xì)信息,包括固件大小,函數(shù)符號(hào),內(nèi)存映射,等等,這里就不詳細(xì)介紹;


另外hex之前寫(xiě)過(guò)一篇文件詳細(xì)介紹過(guò),但是感覺(jué)不用太在意。


summary

簡(jiǎn)單介紹了使用arm工具鏈在構(gòu)建過(guò)程中所產(chǎn)生的幾種文件類(lèi)型,包括,bin文件,hex文件,axf文件,elf格式,map文件等等,由于作者能力水平有限,文章難免存在錯(cuò)誤,請(qǐng)不吝賜教。


如果文章幫助了你,請(qǐng)幫忙三連鼓勵(lì)。



—— The End ——



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