原文:http://blog.chinaunix.net/uid-24148050-id-362928.html
文件的内容:
1. BIN文件是 raw binary 文件,这种文件只包含机器码。
BIN文件(也叫镜像文件)中的所有数据都是机器可以执行的指令码、指令参数或者常量数据,不包含其它调试信息。单片机中烧写的都是bin文件。
2. ELF文件除了机器码外,还包含其它额外的信息,如段的加载地址,运行地址,重定位表,符号表等。
ELF文件相当于是对bin文件的一个包装和解释,不仅仅包含程序的机器码,还包含加载地址、运行地址和调试信息等,使得运行操作系统(带MMU的CPU运行的具有虚拟地址/内存映像功能的OS,如Linux、Windows)的机器中的ELF Loader模块能够根据elf头信息创建一个新进程并加载elf文件中的机器码到该进程的虚拟内存中去。
所以ELF文件的体积比对应的BIN文件要大。
因为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文件
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