ARM:ELF bin Hex axf

前言:
PC平臺流行的可執行文件格式(Executable File Format),主要是Windows下的PE(Portable Executable)和Linux的ELF(Executable and Linking Format,可執行和鏈接格式)。他們都是COFF(Common Object File Format)的變種。ARM架構採用的也是ELF文件格式。
 
COFF是在Unix System V Release 3時由 UNIX 系統實驗室(UNIX System Laboratories, USL)首先提出並且使用的文件規範,後來微軟公司基於COFF格式,制定了PE格式標準,並將其用於當時的Windows NT系統。在System V Release 4時,UNIX系統實驗室(USL)在COFF的基礎上,開發和發佈了ELF格式,作爲應用程序二進制接口 (Application Binary Interface(ABI)。
 
此後,工具接口標準委員會(TIS)選擇了正在發展中的ELF標準作爲工作在32位INTEL體系上不同操作系統之間可移植的二進制文件格式。
 
由於ELF文件具有通用性強的優點,現在流行的開發模式是:先通過編譯工具生成ELF文件格式的可執行文件,在使用外部工具,抽離出ELF文件中的相應部分,生成BIN文件。著名的GNU、bootloader、U-Boot就採用了這種做法。例如,編譯器工具集GCC的BIN生成工具是elf2bin。ARM公司雖然使用的是自家的armcc編譯器,但是也提供了fromelf工具來實現上面的方式。
 
------------------------

Gcc 編譯出來的是ELF文件。通常gcc –o test test.c,生成的test文件就是ELF格式的,在linux shell下輸入 ./test就可以執行。

-------------------------
Bin 文件是經過壓縮的可執行文件,去掉ELF格式的東西。是直接的內存映像的表示。在系統沒有加載操作系統的時候可以執行。
 
  • elf(executable  and   link   format)文件裏面包含了符號表,彙編等。
  • BIN文件是將elf文件中的代碼段,數據段,還有一些自定義的段抽取出來做成的一個內存的鏡像。
 
在Embedded中,如果上電開始運行,沒有OS系統,如果將ELF格式的文件燒寫進去,包含一些ELF格式的東西,arm運行碰到這些指令,就會導致失敗。
兩種文件都可以運行:
機器最終只認BIN,之所以有ELF格式是在有操作系統時,操作系統會根據ELF解析出代碼、數據等等,最終仍是以BIN運行。由於elf文件的信息比較全,所以可以用來以單步跟蹤的方式運行。關鍵是看操作系統的 loader 功能的實現策略。
 
-------------------------
Hex文件,一般是指Intel標準的十六進制文件。Intelhex 文件常用來保存單片機或其他處理器的目標程序代碼。它保存物理程序存儲區中的目標代碼映象。一般編程器均支持生成此種格式文件。
 
--------------------------

Axf文件 由ARM編譯器產生,除了包含bin的內容之外,還附加其他調試信息,這些調試信息加在可執行的二進制數據之前。調試時這些調試信息不會下載到RAM中,真正下載到RAM中的信息僅僅是可執行代碼。因此,如果ram的大小小於axf文件的大小,程序是完全有可能在ram中調試的,只要axf除去調試信息後文件大小小於ram的大小即可。

調試信息有以下功用:

1、 可將源代碼包括註釋夾在反彙編代碼中,這樣我們可隨時切換到源代碼中進行調試。

2、 我們還可以對程序中的函數調用情況進行跟蹤(通過Watch & Call Stack Window查看)。

3、對變量進行跟蹤(利用Watch & Call Stack Window)。

調試信息雖然有用,但程序功能實現後,在目標文件和庫中減少調試信息卻是非常有益的。減少調試信息可減少目標文件和庫大小、加快鏈接速度、減小最終鏡象代碼。以下幾種方法可用來減少每個源文件產生的調試信息:

1、避免在頭文件中條件性的使用#define,鏈接器不能移除共用的調試部分,除非這些部分是完全一樣的。

2、更改C/C++源文件,使#included包含的所有頭文件有相同順序。

3、儘量使用數量較多的小頭文件而不是較大的單一頭文件,這有利於鏈接器獲取更多的通用塊。

4、程序中最好只包含必須用到的頭文件。避免重複包含頭文件,可使用編譯器選項--remarks來產生警告信息;

5、使用編譯命令行選項--no_debug_macros,從調試表中丟棄預處理宏定義。

......................................................................................................................................

小結:
.axf文件=調試信息+.bin文件
  • ELF(Executableand linking format)文件是x86 Linux系統下的一種常用目標文件(objectfile)格式,有三種主要類型:
(1)適於連接的可重定位文件(relocatablefile),可與其它目標文件一起創建可執行文件和共享目標文件。
(2)適於執行的可執行文件(executable file),用於提供程序的進程映像,加載到內存執行。
(3)共享目標文件(shared object file),連接器可將它與其它可重定位文件和共享目標文件連接成其它的目標文件,動態連接器又可將它與可執行文件和其它共享目標文件結合起來創建一個進程映像。 
 
  • 可由elf文件轉化爲hex和bin兩種文件,hex也可以直接轉換爲bin文件
但是bin要轉化爲hex文件必須要給定一個基地址。而hex和bin不能轉化爲elf文件,因爲elf的信息量要大。Axf文件可以轉化爲bin文件,KEIL下可用以下命令fromelf -nodebug xx.axf -bin xx.bin即可。
  • axf和elf都是編譯器生成的可執行文件。 
區別是:ADS編譯出來的是AXF文件( ARM的ELF)。 
gcc編譯出來的是ELF文件。兩者雖然很像,但還是有差別的。 
這是文件格式的差別,不涉及調試格式。 
  • axf/elf是帶格式的映象,bin是直接的內存映象的表示。
  • Linux OS下,ELF通常就是可執行文件,通常gcc -o testtest.c,生成的test文件就是ELF格式,的在Linux Shell下輸入./test就可以執行。
在Embedded中,上電開始運行,沒有OS系統,如果將ELF格式的文件燒寫進去,包含一些ELF格式的東西,arm運行碰到這些指令,就會導致失敗,如果用bin文件,程序就可以一步一步運行。
故:HEX和bin文件可以在裸機上運行,而ELF文件在有OS的環境中運行的。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章