ELF檔案和BIN檔案
原微博連結:http://blog.chinaunix.net/uid-24148050-id-362928.html
分類: LINUX
檔案的內容: 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檔案的轉換:
- 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的生成:
- ........省略
- 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
全是彙編程式碼......+_+