BIN文件和ELF文件

文件的内容

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/bzimage   将vmlinux.bin压缩,并加上一段解压代码得到的
uImage       专用内核镜像(uboot使用),在zImage前加了一个64字节的头,描述内核版本、加载地址生成时间,文件大小等等,它是由uboot的工具mkImage生成的

 



posted on 2022-02-24 10:22  sudochen  阅读(551)  评论(0编辑  收藏  举报

导航