u-boot配置/编译过程
1. u-boot配置过程
make xxx.config
MKCONFIG := $(SRCTREE)/mkconfig
export MKCONFIG
-----》》执行mkconfig
1).确定开发板名称BOARD_NAME .
CONFIG_NAME="${1%_config}"
[ "${BOARD_NAME}" ] || BOARD_NAME="${1%_config}"
2).创建到平台/开发板相关的头文件的链接
ln -s ${LNPREFIX}arch-${soc} asm/arch
ln -s ${LNPREFIX}proc-armv asm/proc
3).创建顶层Makefile包含的文件include/config.mk
[ "${vendor}" ] && echo "VENDOR = ${vendor}"
[ "${soc}" ] && echo "SOC = ${soc}"
exit 0 ) > config.mk
4).创建开发板板相关的头文件include/config.h
> config.h # Create new config file
2.u-boot编译、连接过程
1).包含了配置过程中制作出来的config.mk文件,其中定义了ARCH,CPU,BOARD,SOC...
# load ARCH, BOARD, and CPU configuration
include $(obj)include/config.mk//作出来的config.mk
export ARCH CPU BOARD VENDOR SOC DDR3LIB DDRTYPE
# load other configuration
include $(TOPDIR)/config.mk //包含顶层的config.mk 确定了编译器.编译选项 BOARDDIR LDFLAGS
config.mk中定义了TEXT_BASE (uboot开始位置)
把所有的OBJS 。LIBS所表示的.o,.a文件生成
# U-Boot objects....order is important (i.e. start must be first)
OBJS = $(CPUDIR)/start.o
.......
LIBS-y += lib/libgeneric.o
LIBS-y += lib/lzma/liblzma.o
LIBS-y += lib/lzo/liblzo.o
LIBS-y += lib/zlib/libz.o
得到ELF格式的u-boot ,最后转换为二进制格式U-BOOT.bin LDFLAGS确定连接方式
UNDEF_LST=`$(OBJDUMP) -x $(LIBBOARD) $(LIBS) | \
sed -n -e 's/.*\($(SYM_PREFIX)_u_boot_list_.*\)/-u\1/p'|sort|uniq`;\
cd $(LNDIR) && $(LD) $(LDFLAGS) $(LDFLAGS_$(@F)) \
$$UNDEF_LST $(__OBJS) \
--start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \
-Map u-boot.map -o u-boot
在u-boot.lds 代码中 (指定各种段)
SECTIONS
{
. = 0x00000000;
. = ALIGN(4);
.text :
{
__image_copy_start = .;
arch/arm/cpu/armv7/start.o (.text*)////start.S为uboot入口
*(.text*)
}
. = ALIGN(4);
3.总结uboot 编译流程:
(1)首先编译start.S
(2)对于平台/开发板相关的每个目录,通用目录都使用它们各自的Makefile生成相应的库 .a .o
(3)将生成的.a .o ,文件按照comfig.mk文件中指定的代码段起始地址. u-boot.lds连接脚本进行连接
(4)上一步,得到ELF格式UBOOT,Makefie会把其转换为二进制格式