u-boot编译过程
- 配置:make **config
- 编译:make
1. 配置
2440
使用命令make 100ask24x0_config
来配置makefile
,此过程主要内容:
查看100ask24x0_config所在makefile选项:
@$(MKCONFIG) $(@:_config=) arm arm920t 100ask24x0 NULL s3c24x0
其中$(@:_config=)
表示把100ask24x0_config
的_config替换为空格即删掉。
@$(MKCONFIG)
的值是$(SRCTREE)/mkconfig
,即目录下的mkconfig
文件,而mkconfig
是一个脚本文件。
主要是设置一些参数:
echo "ARCH = $2" > config.mk echo "CPU = $3" >> config.mk echo "BOARD = $4" >> config.mk
等
2. 编译
编译过程主要是编译和链接
make的时候执行:
$(obj)u-boot: depend version $(SUBDIRS) $(OBJS) $(LIBS) $(LDSCRIPT)
UNDEF_SYM=`$(OBJDUMP) -x $(LIBS) |sed -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \
--start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \
-Map u-boot.map -o u-boot
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/2440/u-boot-1.1.6 && arm-linux-ld -Bstatic -T /home/book/2440/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
其中分析arm-linux-ld -Bstatic -T /home/book/2440/u-boot-1.1.6/board/100ask24x0/u-boot.lds -Ttext 0x33F80000
链接文件u-boot.lds的内容:
//连接脚本定义链接地址
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = 0x00000000;//当前地址为0加上传入参数0x33F80000,所以此时当前地址为0x33F80000,即下面的东西排放的开始地址为0x33F80000
. = ALIGN(4);
.text ://文件代码段
{
cpu/arm920t/start.o (.text)
board/100ask24x0/boot_init.o (.text)
*(.text)
}
. = ALIGN(4);//所有文件只读数据段
.rodata : { *(.rodata) }
. = ALIGN(4);//所有文件数据段
.data : { *(.data) }
. = ALIGN(4);
.got : { *(.got) }
. = .;//所有文件uboot命令段
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;
. = ALIGN(4);//bss段
__bss_start = .;
.bss : { *(.bss) }
_end = .;
}
上面定义了u-boot一开始运行在
0x33F80000
地址,开始运行cpu/arm920t/start.o
文件,即启动文件。
里面会通过一个.lds链接文件链接所有.o文件并设置链接地址,链接地址(0x33F80000)
在:u-boot-1.1.6\board\100ask24x0
文件中,此时的值是0x33F80000
即是uboot存放的地址。
通过查看链接脚本
.lds
来查看u-boot启动的地址和启动的第一个文件,从而通过启动文件了解u-boot的启动流程。