下面这一整行是链接出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来查看支持的所有格式。