要想了解uboot的众多文件是怎么链接和编译的最好的办法就是去分析它的makefile。在之前的文章中我们看到了,uboot编译过程中发挥关键作用的两步配置和编译,下面就结合makefile分析一下这两步到底做了什么。
1、分析配置过程
首先在uboot根目录下找到并打开makefile。配置过程中使用了 make 100ask24x0_config命令,在makefile中查找100ask24x0_config。
分析这一条命令。
查找MKCONFIG,说明在源码目录下有mkconfig文件。
$@指的是目标文件,在这就是100ask24x0_config,_config此处无定义被目标文件替换。
综上这一条命令相当于 :mkconfig 100ask24x0_config arm arm920t 100ask24x0 NULL s3c24x0。
打开uboot根目录下的mkconfig进行进一步分析。
可以看出mkconfig文件的作用是对mkconfig 100ask24x0_config arm arm920t 100ask24x0 NULL s3c24x0这条命令传入的参数进行分析。
这条命令共有7个参数大于0个,第一个参是arm不含--、-a、-n、*,因此APPEND=no, BOARD_NAME=arm,终端回显输出Configuring for ${BOARD_NAME} board...
判断SRCTREE和OBJTREE是否相等。
搜索makefile
BUILD_DIR未定义,所以SRCTREE和OBJTREE都等于CURDIR,执行else分支。
进入include目录删除原有的asm文件,建立链接指向asm-arm的链接文件asm。
删除asm-arm/arch目录
判读$6参数是否为空或者不存在,进入else分支。LNPREFIX未定义,相当于执行在arch目录下建立指向arch-s3c24x0的asm-arm文件的命令。
$2参数等于arm,执行在proc目录下建立指向proc-armv的asm-arm文件的命令。
创建config.mk文件,并将"ARCH = arm"写入文件;
在文件中追加"CPU = arm920t";
在文件中追加"BOARD = 100ask24x0";
$6存在且不为空,在文件中追加"SOC = s3c24x0"。
最终config.mk的内容为:
ARCH = arm
CPU = arm920t
BOARD = 100ask24x0
SOC = s3c24x0
APPEND = no进入else分支,创建config.h。
追加"/* Automatically generated - do not edit */" 到config.h;
追加"#include <configs/$1.h>" 到config.h;
exit(0):正常运行程序并退出程序。
2、分析编译过程
分析makefile
这里将之前配置时生成的配置文件包含了进去。
此处OBJS=arm920t。
lib文件是将相应目录下编译好的文件进行打包。
make时不指定目标就自动指向第一个目标 ,所以all依赖于ALL。
uboot.bin依赖于uboot.elf。
uboot.elf依赖于上图的文件。直接分析makefile可能比较麻烦,我们可以make之后看后几行echo。
cd /home/book/Desktop/u-boot-1.1.6 && arm-linux-ld -Bstatic -T /home/book/Desktop/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 -L /work/tools/gcc-3.4.5-glibc-2.3.6/lib/gcc/arm-linux/3.4.5 -lgcc \
-Map u-boot.map -o u-boot
可以分析出:
1、链接时第一个文件是cpu/arm920t/start.S
2、链接地址=borad/100ask24x0/u-boot.lds + TEXT_BASE