可執行檔案格式elf和bin

2022-06-21 06:42:10 字數 3350 閱讀 1837

常用的可執行檔案包含兩類:原始二進位制檔案(bin)和可載入執行的二進位制檔案,在linux中可載入執行的二進位制檔案為elf檔案。

在linux os上,為了執行可執行檔案,他們是遵循elf格式的,通常gcc -o test test.c,生成的test檔案就是elf格式的。執行elf檔案時核心會使用載入器來解析elf檔案並執行。

elf檔案格式是乙個開放標準,各種unix系統的可執行檔案都採用elf格式,它有三種不同的型別:

$ file sum.o sub.o test.o libsub.so test

sum.o: elf

32-bit lsb relocatable, intel 80386, version 1

(sysv), not stripped

sub.o: elf

32-bit lsb relocatable, intel 80386, version 1

(sysv), not stripped

test.o: elf

32-bit lsb relocatable, intel 80386, version 1

(sysv), not stripped

libsub.so: elf

32-bit lsb shared object, intel 80386, version 1

(sysv), not stripped

test: elf

32-bit lsb executable, intel 80386, version 1 (sysv), for gnu/linux 2.2.5

, dynamically linked (uses shared libs), not stripped

結果很清楚的告訴我們他們都屬於哪乙個類別。比方 sum.o 是應用在x86架構上的可重定位檔案。這個結果也間接的告訴我們,x86是小端模式(lsb)的32位結構。

那對於 file 命令來說,它又能如何知道這些資訊?答案是在elf物件檔案的最前面有乙個elf檔案頭,裡面記載了所適用的處理器、物件檔案型別等各種資訊。

elf格式提供了兩種不同的視角,鏈結器把elf檔案看成是section的集合,而載入器把elf檔案看成是segment的集合。

在embedded中,如果上電開始執行,沒有os系統,如果將elf格式的檔案燒寫進去, 包含一些elf檔案的符號表字元表之類的section,執行碰到這些,就會導致失敗,如果用objcopy生成純粹的二進位制檔案,去除掉符號表之類的 section,只將**段資料段保留下來,程式就可以一步一步執行。elf檔案裡面包含了符號表等。bin檔案是將elf檔案中的**段,資料段,還有一些自定義的段抽取出來做成的乙個記憶體的映象。並且elf檔案中**段資料段的位置並不是它實際的物理位置,實際物理位置是在表中標記出來的。

1. bin檔案是 raw binary 檔案,這種檔案只包含機器碼。

2. elf檔案除了機器碼外,還包含其它額外的資訊,如段的載入位址,執行位址,重定位表,符號表等。

所以elf檔案的體積比對應的bin檔案要大。

1. 執行raw binary很簡單,只需要將程式載入到其起始位址,就可以執行;

file *fp = fopen("

vmlinux.bin

", "rb"

); fread(vmlinux_start,

1, vmlinux_size, fp);

((void (*)(void))vmlinux_start)();

2. 執行elf程式則需要乙個elf loader。

uboot和linux kernel啟動的時候是沒有elf loader的,所以燒在flash上的檔案只能是raw binary格式的,即映象檔案image。

1. 通過gcc編譯出來的是elf檔案

2. 通過objcpy可以把elf檔案轉換為bin檔案

cc=ppc-gcc

ld=ppc-ld

objcopy=ppc-objcopy

$(cc) -g $(cflag) -c boot.s

#先將boot.s檔案生成boot.o

$(ld) -g -bstatic -t$(ldfile) \

-ttext 0x12345600

boot.o \

--start-group -map boot.map -o boot.elf

#再將boot.o生成boot.elf

$(objcopy) -o binary -r .note -r .comment -s boot.elf boot.bin

#接著將 boot.elf 轉換為 boot.bin

#使用

-o binary (或--out-target=binary) 輸出為原始的二進位制檔案

#使用 -r .note (或--remove-section) 輸出檔案中不要.note這個section,縮小了檔案尺寸

#使用 -s (或 --strip-all) 輸出檔案中不要重定位資訊和符號資訊,縮小了檔案尺寸

編譯完uboot後生成:

u-boot         elf檔案可用來除錯

u-boot.bin     bin檔案用來燒在flash上

編譯linux生成:

vmlinux        elf檔案可用來除錯

vmlinux.bin    bin檔案,沒直接用過

zimage/vmlinuz/bzimage

將vmlinux.bin壓縮,並加上一段解壓**得到的,不可和bootloader共存?

uimage        

uboot專用的核心映象,在zimage前加了乙個64位元組的頭,描述核心版本、載入位址、生成時間,檔案大小等等。 其0x40後的內容和zimage一樣。

它是由uboot的工具mkimage生成的。

uimage相對於zimage的優點在於:uimage可以和uboot共存。

1. 我們除錯一般都是使用elf檔案,比如:

nm elf檔案         #得到符號表

objdump -d elf檔案 #反彙編,且彙編**與原始碼混排

2. bin檔案比較杯具,裡面全是機器碼,所以只能反彙編

objdump -b binary -m powerpc uboot.bin

此外還有工具:readelf,objcopy,ldd,file等。

參考:1.elf格式檔案和bin檔案的區別

2.可執行檔案(elf)格式的理解

3. 嵌入式系統可執行檔案格式

4. linux中elf格式檔案介紹

5. elf檔案和bin檔案

可執行檔案格式elf和bin

常用的可執行檔案包含兩類 原始二進位制檔案 bin 和可載入執行的二進位制檔案,在linux中可載入執行的二進位制檔案為elf檔案。在linux os上,為了執行可執行檔案,他們是遵循elf格式的,通常gcc o test test.c,生成的test檔案就是elf格式的。執行elf檔案時核心會使用...

可執行檔案 ELF 格式

elf executable and linking format 是一種物件檔案的格式,用於定義不同型別的物件檔案 object files 中都放了什麼東西 以及都以什麼樣的格式去放這些東西。它自最早在 system v 系統上出現後,被 unix 世界所廣泛接受,作為預設的二進位制檔案格式來使...

可執行檔案格式

測試平台 在windows下使用gcc編譯c檔案。gcc的幾個用法 每一步單獨處理 gcc e main.c o main.i 將main.c預處理 gcc s main.i o main.s 將預處理的main.i檔案轉換成彙編檔案main.s gcc c main.s o main.o 將彙編檔...