日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ELF文件和BIN文件

發布時間:2023/12/10 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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文件的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。