聊聊LiteOS中生成的Bin、HEX、ELF三種文件格式
我們在使用編譯器在編譯工程后會要求生成可執行文件,將這些文件燒錄到MCU進行運行,達到我們測試和使用程序的目的,再使用工具鏈進行編譯的時候往往生成.bin、.hex 、.elf 、.alf等文件,這些文件有什么區別呢?可以互相轉換嗎?LiteOS 有哪些可執行文件呢?本文意義進行闡述。
BIN
bin文件,是基本的二進制文件,是flash中IO保存的基本信息,是有匯編程序直接匯編得到的二進制代碼,bin文件采用順序記錄flash中的信息,文本本身包含任任何地址信息,bin文件燒錄就是指定flash開始地址后逐個拷貝即可。利用STM32CubeProm將LiteOS編譯后生成的bin文件顯示如下圖,我們需要設定flash寫入地址才能進行燒錄。
HEX
hex文件格式是可以燒寫到單片機中,被單片機執行的一種文件格式,生成Hex文件的方式有很多種,可以通過不同的編譯器將C程序或者匯編程序編譯生成hex;最常用的Hex格式是Intel HEX文件格式,即遵循Intel HEX文件格式的ASCII文本文件,文件的每一行都包含了 一個HEX記錄。這些記錄是由一些代表機器語言代碼和常量的16進制數據組成的。Intel HEX文件常用來傳輸要存儲在ROM 或者 EPROM中的程序和數據。大部分的EPROM編程器和FLASH能使用Intel HEX文件。
上面的Huawei_LiteOS.bin對應的HEX文件如下(用notepad++打開)
:020000040800F2 :2000000000000820F50E0008650F0008650F0008650F0008650F0008650F00080000000041 :20002000000000000000000000000000650F0008650F000800000000650F0008650F0008D0 ......................................................................... ......................................................................... ......................................................................... :208E0000D883050828830508D4820508148505081C8505082485050868CC03082C850508C8 :0C8E20003485050804CD030804CD0308C8 :00000001FF
文件會有頭尾部的的說明。
文件頭不的信息
:020000040800F2
02帶邊數據長度;緊跟著后面的0x00 0x00 為地址;再后面的0x04為數據類型,類型共分以下幾類:
'00' //數據記錄
'01' //文件結束記錄
'02' //擴展段地址記錄
'03' //開始段地址記錄
'04' //擴展線性地址記錄
'05' //開始線性地址記錄
接著0x04后面的兩個 0x08 0x00就是數據,表示偏移地址,最后一個0xF2是校驗碼。
第二行開始的記錄地址和所對應的數據其格式是
:開始代碼|地址|數據類型|數據|校驗
:20|0000|00|00000820F50E0008650F0008650F0008650F0008650F0008650F000800000000|41
:20 ?記錄數據長度為20個字節;
0000 數據在內中的起始地址
00 ? 記錄類型00(是一個數據記錄)
00000820F50E0008650F0008650F0008650F0008650F0008650F000800000000 數據內容
41 ? 這一行的校驗
最后一行的內容表示文件結束記錄
:00000001FF
hex文件同一樣可以在STM32CubeProm打印出內存的內容(與之前的bin打印是一致的)。
ELF
在計算機科學中,是一種用于二進制文件、可執行文件、目標代碼、共享庫和核心轉儲格式文件,是UNIX系統實驗室(USL)作為應用程序二進制接口(Application Binary Interface,ABI)而開發和發布的,也是Linux的主要可執行文件格式。
elf(Executable and Linkable Format)可執行與可鏈接格式,是有別于hex和bin通過記錄數據的格式,elf更多而記錄程序的連接轉儲的格式文件,elf目標文件是由匯編器(assembler)和連接編輯器(link editor)生成的,內容是二進制,而非可讀的文本形式,是可以直接在處理器上運行的代碼。
簡單的理解,elf文件將二進制(bin)文件和程序描述文件打包后的一種執行文件,下載到程序里的依然是bin文件的部分,但是仿真器可以依靠其余程序表述文件來獲取程序執行的位置和二進制的對應。表意文件可以利用readelf在linux下讀取,因為我系統的原因就不贅述了。
其他可執行文件:
.asf、.o、.out這些文件都是編譯后的可執行文件,和elf以宣揚都是具有連接格式進行描述,可以利用仿真器進行仿真使用,只是編譯格式和編譯器設置的不同可以選擇不同的文件格式。
可轉換性
因為bin、hex都是只是記錄數據的,但elf類型不僅記錄數據還有程序描述,所以,elf可以轉成bin和hex使用,但是反轉。
對比一下,發現bin文件最小最簡單,但是安全性差,功能性差,hex包含頭尾和檢驗,就有很好的安全性,但是文件比bin大,功能沒有elf強大;elf功能多,但是文件最大。
LIteOS如何生成這些文件的
liteOS通過makefile進行文件編譯,也是通過makefile進行設置gcc編譯文件的輸出格式,在工程目錄下的makefile代碼中:
$(LD) $(LITEOS_LDFLAGS) $(LITEOS_TABLES_LDFLAGS) $(LITEOS_DYNLDFLAGS) -Map=$(OUT)/$@.map -o $(OUT)/$@.elf --start-group $(LITEOS_BASELIB) --end-group $(OBJCOPY) -O binary $(OUT)/$@.elf $(OUT)/$@.bin $(OBJDUMP) -t $(OUT)/$@.elf |sort >$(OUT)/$@.sym.sorted $(OBJDUMP) -d $(OUT)/$@.elf >$(OUT)/$@.asm $(SIZE) $(OUT)/$@.elf
代碼中的解釋后的代碼
arm-none-eabi-gcc -o xx.elf arm-none-eabi-objcopy -O ihex xx.elf xx.hex arm-none-eabi-objcopy -O binary xx.elf xx.bin out --format ihex write xx.hex
通過gcc編譯的命令將結果生成為xx.elf的格式,在通過elf生成bin和hex的目標文件。
結論
Makefile 輕量級操作系統 LiteOS
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。