gcc 編譯出來的是elf檔案。通常gcc –o test test.c,生成的test檔案就是elf格式的,在linuxshell下輸入 ./test就可以執行。
bin 檔案是經過壓縮的可執行檔案,去掉elf格式的東西。是直接的記憶體映像的表示。在系統沒有載入作業系統的時候可以執行。
elf(executable and link format)檔案裡面包含了符號表,彙編等。
bin檔案是將elf檔案中的**段,資料段,還有一些自定義的段抽取出來做成的乙個記憶體的映象。
在embedded中,如果上電開始執行,沒有os系統,如果將elf格式的檔案燒寫進去,包含一些elf格式的東西,arm執行碰到這些指令,就會導致失敗,如果用arm-softfloat-linux-gnu-objcopy生成純粹的彙編 bin檔案,程式就可以一步一步執行。
兩種檔案都可以執行
機器最終只認bin,之所以有elf格式是在有作業系統時,作業系統會根據elf解析出**、資料等等,最終仍是以bin執行。由於elf檔案的資訊比較全,所以可以用來以單步跟蹤的方式執行。關鍵是看loader。
嵌入式開發的時候,我們的編譯乙個*.s檔案,並最終生成bin檔案,編譯命令大致如下:
cc=arm-softfloat-linux-gnu-gcc
ld=arm-softfloat-linux-gnu-ld
objcopy=arm-softfloat-linux-gnu-objcopy
( cc
)−
g(cc) -g
(cc)−g
(cflag) -c boot.s #先將boot.s檔案生成boot.o
( ld
)−g−
bsta
tic−
t(ld) -g-bstatic -t
(ld)−g
−bst
atic
−t(ldfile) -ttext 0x12345600 boot.o --start-group -map boot.map -oboot.elf #再將boot.o生成boot.elf,boot.elf通常就是可執行檔案,類似於gcc-o test test.c 中的test檔案,在linuxshell下輸入./test就可以執行。
$(objcopy)-o binary boot.elf boot.bin #接著將boot.elf->boot.bin,這樣可以縮小**尺寸。
執行arm-softfloat-linux-gnu-objdump-h boot.elf 可以檢視該檔案的資訊,但是如果變成
arm-softfloat-linux-gnu-objdump-h boot.bin會提示錯誤,為了看boot.bin檔案資訊,輸入:
arm-softfloat-linux-gnu-objdump-h -b binary -m arm boot.bin就可以了。哈哈我也是現學了一招,其中引數-h可以被替換成為-d, -s,-s等等,請用arm-softfloat-linux-gnu-objdump–help檢視器中表示的意義。
elf檔案和bin檔案區別
elf檔案格式是乙個開放標準,各種unix系統的可執行檔案都採用elf格式,它有三種不同的型別 elf格式提供了兩種不同的視角,鏈結器把elf檔案看成是section的集合,而載入器把elf檔案看成是segment的集合。有一篇文章介紹elf檔案的格式以及載入過程介紹的很詳細,可以看一下,在linu...
ELF檔案和BIN檔案
檔案的內容 1.bin檔案是 raw binary 檔案,這種檔案只包含機器碼。2.elf檔案除了機器碼外,還包含其它額外的資訊,如段的載入位址,執行位址,重定位表,符號表等。所以elf檔案的體積比對應的bin檔案要大。檔案的執行 1.執行raw binary很簡單,只需要將程式載入到其起始位址,就...
ELF檔案和BIN檔案
檔案的內容 1.bin檔案是 raw binary 檔案,這種檔案只包含機器碼。2.elf檔案除了機器碼外,還包含其它額外的資訊,如段的載入位址,執行位址,重定位表,符號表等。所以elf檔案的體積比對應的bin檔案要大。檔案的執行 1.執行raw binary很簡單,只需要將程式載入到其起始位址,就...