ELF文件和BIN文件
生活随笔
收集整理的這篇文章主要介紹了
ELF文件和BIN文件
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
文件的內(nèi)容:
1. BIN文件是 raw binary 文件,這種文件只包含機(jī)器碼。
2. ELF文件除了機(jī)器碼外,還包含其它額外的信息,如段的加載地址,運(yùn)行地址,重定位表,符號表等。
所以ELF文件的體積比對應(yīng)的BIN文件要大。
文件的執(zhí)行:
1. 執(zhí)行raw binary很簡單,只需要將程序加載到其起始地址,就可以執(zhí)行;
??? FILE *fp = fopen("vmlinux.bin", "rb");
??? fread(VMLINUX_START, 1, VMLINUX_SIZE, fp);
??? ((void (*)(void))VMLINUX_START)();
2. 執(zhí)行ELF程序則需要一個ELF Loader。
現(xiàn)在知道了吧,uboot和Linux kernel啟動的時候是沒有ELF Loader的
所以燒在flash上的文件只能是raw binary格式的,即鏡像文件image
文件的轉(zhuǎn)換:
1. 通過gcc編譯出來的是elf文件
2. 通過objcpy可以把elf文件轉(zhuǎn)換為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 轉(zhuǎn)換為 boot.bin #使用 -O binary?(或--out-target=binary)?輸出為原始的二進(jìn)制文件 #使用 -R .note??(或--remove-section)????輸出文件中不要.note這個section,縮小了文件尺寸
#使用 -S????????(或 --strip-all)??????? 輸出文件中不要重定位信息和符號信息,縮小了文件尺寸 編譯完uboot后生成:
???? u-boot???????? ELF文件可用來調(diào)試
???? u-boot.bin???? BIN文件用來燒在Flash上
編譯linux生成:
? ?? vmlinux? ? ? ? ELF文件可用來調(diào)試
???? vmlinux.bin??? BIN文件,沒直接用過
???? zImage/vmlinuz/bzimage
????????? 將vmlinux.bin壓縮,并加上一段解壓代碼得到的,不可和bootloader共存?
???? uImage?????????
????????? uboot專用的內(nèi)核鏡像,在zImage前加了一個64字節(jié)的頭,描述內(nèi)核版本、加載地址
????????? 生成時間,文件大小等等。 其0x40后的內(nèi)容和zImage一樣
????????? 它是由uboot的工具mkImage生成的。?
uImage相對于zImage的優(yōu)點在于:uImage可以和uboot共存。
網(wǎng)上的一個圖片很強(qiáng)大,講解了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 (第三步)
文件的調(diào)試:
1. 我們調(diào)試一般都是使用elf文件,比如:
nm elf文件 ? ? ? ??#得到符號表 objdump -D elf文件?#反匯編,且匯編代碼與源碼混排
2. bin文件比較杯具,里面全是機(jī)器碼,所以只能反匯編
objdump -b binary -m powerpc uboot.bin 全是匯編代碼......+_+
1. BIN文件是 raw binary 文件,這種文件只包含機(jī)器碼。
2. ELF文件除了機(jī)器碼外,還包含其它額外的信息,如段的加載地址,運(yùn)行地址,重定位表,符號表等。
所以ELF文件的體積比對應(yīng)的BIN文件要大。
文件的執(zhí)行:
1. 執(zhí)行raw binary很簡單,只需要將程序加載到其起始地址,就可以執(zhí)行;
??? FILE *fp = fopen("vmlinux.bin", "rb");
??? fread(VMLINUX_START, 1, VMLINUX_SIZE, fp);
??? ((void (*)(void))VMLINUX_START)();
2. 執(zhí)行ELF程序則需要一個ELF Loader。
現(xiàn)在知道了吧,uboot和Linux kernel啟動的時候是沒有ELF Loader的
所以燒在flash上的文件只能是raw binary格式的,即鏡像文件image
文件的轉(zhuǎn)換:
1. 通過gcc編譯出來的是elf文件
2. 通過objcpy可以把elf文件轉(zhuǎn)換為bin文件
???? u-boot???????? ELF文件可用來調(diào)試
???? u-boot.bin???? BIN文件用來燒在Flash上
編譯linux生成:
? ?? vmlinux? ? ? ? ELF文件可用來調(diào)試
???? vmlinux.bin??? BIN文件,沒直接用過
???? zImage/vmlinuz/bzimage
????????? 將vmlinux.bin壓縮,并加上一段解壓代碼得到的,不可和bootloader共存?
???? uImage?????????
????????? uboot專用的內(nèi)核鏡像,在zImage前加了一個64字節(jié)的頭,描述內(nèi)核版本、加載地址
????????? 生成時間,文件大小等等。 其0x40后的內(nèi)容和zImage一樣
????????? 它是由uboot的工具mkImage生成的。?
uImage相對于zImage的優(yōu)點在于:uImage可以和uboot共存。
網(wǎng)上的一個圖片很強(qiáng)大,講解了arm平臺的uImage的生成:
ppc平臺uImage有點不同,make uImage后查看源代碼目錄的verbose.log
文件的調(diào)試:
1. 我們調(diào)試一般都是使用elf文件,比如:
2. bin文件比較杯具,里面全是機(jī)器碼,所以只能反匯編
總結(jié)
以上是生活随笔為你收集整理的ELF文件和BIN文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 贵州D2809次动车撞泥石流脱线1死8伤
- 下一篇: 中国空间站再“上新”:小机械臂登场 位置