U-boot最后链接选项和objcopy的选项分析

下面这一整行是链接出u-boot文件的命令,这个u-boot是elf格式的。

 

UNDEF_SYM =`arm-linux-objdump -x lib_generic/libgeneric.a board/samsung/mini6410/libmini6410.a cpu/s3c64xx/libs3c64xx.a cpu/s3c64xx/s3c6410/libs3c6410.a lib_arm/libarm.a fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a net/libnet.a disk/libdisk.a rtc/librtc.a dtt/libdtt.a drivers/libdrivers.a drivers/nand/libnand.a drivers/nand_legacy/libnand_legacy.a drivers/onenand/libonenand.a drivers/sk98lin/libsk98lin.a post/libpost.a post/cpu/libcpu.a common/libcommon.a |sed  -n -e 's/.*/(__u_boot_cmd_.*/)/-u/1/p'|sort|uniq `;/
        cd /media/Study/Project/mini6410/Linux/u-boot-mini6410 && arm-linux-ld -Bstatic -T /media/Study/Project/mini6410/Linux/u-boot-mini6410/board/samsung/mini6410/u-boot.lds -Ttext 0xc7e00000   $UNDEF_SYM cpu/s3c64xx/start.o /
            --start-group lib_generic/libgeneric.a board/samsung/mini6410/libmini6410.a cpu/s3c64xx/libs3c64xx.a cpu/s3c64xx/s3c6410/libs3c6410.a lib_arm/libarm.a fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a net/libnet.a disk/libdisk.a rtc/librtc.a dtt/libdtt.a drivers/libdrivers.a drivers/nand/libnand.a drivers/nand_legacy/libnand_legacy.a drivers/onenand/libonenand.a drivers/sk98lin/libsk98lin.a post/libpost.a post/cpu/libcpu.a common/libcommon.a --end-group -L /usr/local/arm/4.4.1/bin/../lib/gcc/arm-none-linux-gnueabi/4.4.1/armv4t -lgcc -Map u-boot.map -o u-boot

 

蓝色 的部分定义了一个变量UNDEF_SYM ,这个变量实际上就是把中间这一群的静态库里面__u_boot_cmd_开头的symbol都提取出来,并在每个的开头加上了-u,以备后用。

 

接下来就是执行arm-linux-ld 进行链接了。

-Bstatic 表示静态链接

-T u-boot.lds 表示使用u-boot.lds,linker script来链接

-Ttext 0xc7e00000 表示将text段,放到绝对地址为0xc7e00000的地方。话说这个的真正意义还不清楚。是说text段会load到这个地址?

$UNDEF_SYM 是一串-u symbol的东东。用处是Force symbol to be entered in the output file as an undefined symbol,可惜我真没看懂。

--start-group --end-group 之间列出了所有的archives. 同一般的直接写archive不同在于,当search了一遍仍然有undefined reference的时候,会继续搜索。

-Map  link map。 这个东东挺重要的,要再学习一下。

 

好了u-boot的elf格式已经出来了,但是这个文件是不能直接烧写到flash,来直接跳转的。因为这个时候还没有os呢。

arm-linux-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin

这条命令生成的u-boot就是可以直接烧写的image了。

--gap-fill=0xff 指明了用0xff来填充section之间的空隙。

-O binary 输出可是是binary。话说这个binary到底算是什么格式,我也不是很清楚了。 貌似可以用objdump -i来查看支持的所有格式。

你可能感兴趣的:(U-boot)