Linux之uboot入门(三)---make

上一篇我们分析了make config的具体过程。

那么第二条指令就是make。

在make的过程中,服务器做了哪些编译呢?

 

还是分析Makefile,

首先找到all, 这是make的终极目标。

Linux之uboot入门(三)---make_第1张图片

第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行相关部分的信息。

这里我们选择第二种,看起来会方便一点。

Linux之uboot入门(三)---make_第2张图片

这里我们可以看到和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开始分析入手。

Linux之uboot入门(三)---make_第3张图片

从这里可以看到,

最先放置的是代码段(text),而在代码段中,最先放置的是start.o和boot_init.o。

那么说明star.o和boot_init.o的源文件是入口代码。

紧接着是其他所有代码段地址(*.text),

只读数据段地址(*.rodata)

数据段地址(*.data)

...

等等。

所以接下来分析的话需要先从start.S和boot_init.S开始入手分析u_boot的源码开始。

总结一下u_boot的编译流程:

Linux之uboot入门(三)---make_第4张图片

你可能感兴趣的:(S3C2440)