最近在学习U-Boot,关于U-Boot的配置、编译和链接,网上找到一篇比较好的博文,mark并推荐一下。
链接:https://www.cnblogs.com/CrazyCatJack/p/6056564.html
学习总结:
1.U-Boot的配置
在编译U-Boot之前需根据自己的板子对U-Boot进行配置,配置命令为make xxx_config(xxx表示自己的开发板名称)。那么这条命令是怎么对我们的U-Boot进行配置的,配置过程中做了哪些操作呢?
make xxx_config命令执行U-boot根目录下的Makefile文件,这个文件是我们配置和编译U-Boot的总纲。xxx_config在Makefile中是一个目标,我们在Makefile中找到xxx_config的地方。
MKCONFIG := $(SRCTREE)/mkconfig
smdk6410_config : unconfig
@$(MKCONFIG) $(@:_config=) arm s3c64xx smdk6410 samsung s3c6410
我们的目标是smdk6410_config,需要执行的操作是调用U-Boot根目录下的mkconfig脚本,并将命令行中的参数传给mkconfig。
既执行 ./mkconfig smdk6410 arm s3c64xx smdk6410 samsung s3c6410
那mkconfig脚本做了哪些操作呢?这里就不贴代码,总结:
1.生成board name
2.创建链接文件
3.创建/include/config.mk文件
ARCH = arm
CPU = s3c64xx
BOARD = smdk6410
VENDOR = samsung
SOC = s3c6410
4.创建开发板相关头文件/include/config.h
/* Automatically generated - do not edit */
#include <configs/smdk6410.h>
至此,我们U-Boot的配置工作完成。
2. U-Boot的编译
编译我们只需输入make命令,命令根据U-Boot根目录下的Makefile进行编译。Makefile会包含我们上面配置生成的文件指导编译。
1.包含/include/config.mk,根据配置生成的ARCH CPU BOARD VENDOR SOC信息选择交叉编译工具
# load ARCH, BOARD, and CPU configuration
include $(OBJTREE)/include/config.mk
export ARCH CPU BOARD VENDOR SOC
ifndef CROSS_COMPILE
ifeq ($(HOSTARCH),ppc)
CROSS_COMPILE =
else
ifeq ($(ARCH),ppc)
CROSS_COMPILE = powerpc-linux-
endif
ifeq ($(ARCH),arm)
CROSS_COMPILE = arm-linux-
endif
ifeq ($(ARCH),i386)
ifeq ($(HOSTARCH),i386)
CROSS_COMPILE =
else
CROSS_COMPILE = i386-linux-
endif
endif
2.包含/config.mk,配置交叉编译选项和结构依赖规则。
#load other configuration
include $(TOPDIR)/config.mk
3.设置OBJS和LIBS变量
4.编译生成目标
ALL = $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND)
all: $(ALL)
$(obj)u-boot.hex: $(obj)u-boot
$(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@
$(obj)u-boot.srec: $(obj)u-boot
$(OBJCOPY) ${OBJCFLAGS} -O srec $< $@
$(obj)u-boot.bin: $(obj)u-boot
$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
$(OBJCOPY) -d $< > $<.dis
$(obj)u-boot.image: $(obj)u-boot.bin
...
...
...
$(OBJ)u-boot.dis: $(obj)u-boot
$(OBJDUMP) -d $< > $@
...
...
...
3. U-Boot的链接
通过链接,我们可以得到我们的目标文件。
/board/samsung/smdk6410/u-boot.lds
/board/samsung/smdk6410/config.mk