ELF與BIN檔案區別

2021-10-02 13:49:56 字數 1487 閱讀 5368

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很簡單,只需要將程式載入到其起始位址,就...