上一篇我们分析了make config的具体过程。
那么第二条指令就是make。
在make的过程中,服务器做了哪些编译呢?
还是分析Makefile,
首先找到all, 这是make的终极目标。
第242行可以找到all,他的依赖文件是240行的
$(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND)
我们看到其中之一是u_boot.bin
那么接着往下找u_boot.bin的依赖:
250行是u_boot.bin的依赖关系,依赖的是u_boot(elf格式)。
263行是u_boot的依赖。到这里我们有两种分析方式,
第一种,顺着下面的编译条件一路查找下去。
第二种,make后肯定会生成u_boot.bin,打印信息可以看到和263行相关部分的信息。
这里我们选择第二种,看起来会方便一点。
这里我们可以看到和263行相关的部分。
依次展开:
UNDEF_SYM=`arm-linux-objdump -x
lib_generic/libgeneric.a
board/100ask24x0/lib100ask24x0.a
cpu/arm920t/libarm920t.a
cpu/arm920t/s3c24x0/libs3c24x0.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/usb/libusb.a
drivers/sk98lin/libsk98lin.a
common/libcommon.a |sed -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
cd /home/book/windows_share/u_boot_1.1.6/u-boot-1.1.6 &&
arm-linux-ld -Bstatic -T
/home/book/windows_share/u_boot_1.1.6/u-boot-1.1.6/board/100ask24x0/u-boot.lds -Ttext 0x33F80000
$UNDEF_SYM cpu/arm920t/start.o \ //这里得到第一个文件
--start-group
lib_generic/libgeneric.a
board/100ask24x0/lib100ask24x0.a
cpu/arm920t/libarm920t.a
cpu/arm920t/s3c24x0/libs3c24x0.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/usb/libusb.a
drivers/sk98lin/libsk98lin.a
common/libcommon.a
--end-group \
-Map u-boot.map -o u-boot
我们可以看到在链接脚本中,u_boot.lds 的BASE_ADDR是0x33F80000。
那么我们从这个u_boot.lds开始分析入手。
从这里可以看到,
最先放置的是代码段(text),而在代码段中,最先放置的是start.o和boot_init.o。
那么说明star.o和boot_init.o的源文件是入口代码。
紧接着是其他所有代码段地址(*.text),
只读数据段地址(*.rodata)
数据段地址(*.data)
...
等等。
所以接下来分析的话需要先从start.S和boot_init.S开始入手分析u_boot的源码开始。
总结一下u_boot的编译流程: