ELF文件和BIN文件
文件的內容:
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共存。
網上的一個圖片很強大,講解了arm平臺的uImage的生成:
ppc平臺uImage有點不同,make uImage后查看源代碼目錄的verbose.log
........省略
make -f scripts/Makefile.build obj=arch/ppc/boot/images arch/ppc/boot/images/uImage
ppc_85xx-objcopy -O binary vmlinux arch/ppc/boot/images/vmlinux.bin (第一步)
gzip -f -9 < arch/ppc/boot/images/vmlinux.bin > arch/ppc/boot/images/vmlinux.gz.$ && mv arch/ppc/boot/images/vmlinux.gz.$ arch/ppc/boot/images/vmlinux.gz (第二步)
rm -f arch/ppc/boot/images/uImage
/bin/sh /root/project/eldk4.2/ppc_85xx/usr/src/8541-reduece-ppc-linux-2.6.24/scripts/mkuboot.sh -A ppc -O linux -T kernel -C gzip -a 00000000 -e 00000000 -n 'Linux-2.6.24.2' -d arch/ppc/boot/images/vmlinux.gz arch/ppc/boot/images/uImage (第三步)
文件的調試:
1. 我們調試一般都是使用elf文件,比如:
nm elf文件 #得到符號表
objdump -D elf文件#反匯編,且匯編代碼與源碼混排
2. bin文件比較杯具,里面全是機器碼,所以只能反匯編
objdump -b binary -m powerpc uboot.bin
全是匯編代碼......+_+
總結
以上是生活随笔為你收集整理的ELF文件和BIN文件的全部內容,希望文章能夠幫你解決所遇到的問題。