1. 程式人生 > >ELF檔案和BIN檔案

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檔案的轉換:

1. 通過gcc編譯出來的是elf檔案 2. 通過objcpy可以把elf檔案轉換為bin檔案  

  1. CC=ppc-gcc
  2. LD=ppc-ld
  3. OBJCOPY=ppc-objcopy
  4. $(CC) -g $(CFLAG) -c boot.S
  5. #先將boot.S檔案生成boot.o
  6. $(LD) -g -Bstatic -T$(LDFILE) \
  7. -Ttext 0x12345600 boot.o \
  8. --start-group -Map boot.map -o boot.elf
  9. #再將boot.o生成boot.elf
  10. $(OBJCOPY) -O binary -R .note -R .comment -S boot.elf boot.bin
  11. #接著將 boot.elf 轉換為 boot.bin
  12. #使用 -O binary (或--out-target=binary) 輸出為原始的二進位制檔案
  13. #使用 -R .note  (或--remove-section)    輸出檔案中不要.note這個section,縮小了檔案尺寸
  14. #使用 -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

  1. ........省略
  2. make -f scripts/Makefile.build obj=arch/ppc/boot/images arch/ppc/boot/images/uImage
  3. ppc_85xx-objcopy -O binary vmlinux arch/ppc/boot/images/vmlinux.bin (第一步)
  4. 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 (第二步)
  5. rm -f arch/ppc/boot/images/uImage
  6. /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檔案,比如:

  1. nm elf檔案         #得到符號表
  2. objdump -D elf檔案 #反彙編,且彙編程式碼與原始碼混排

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

  1. objdump -b binary -m powerpc uboot.bin

全是彙編程式碼......+_+