boot的配置、编译及链接(3)

  根据注释,第一段代码的作用是创建包含的文件,为配置做准备。这里我们主要是创建config.mk文件。这里说明一下">"表示创建某文件,">>"表示将内容添加到某文件。所以接下来几行的含义就分别是:创建config.mk文件,并添加"ARCH  = arm",添加"CPU  = arm920t",添加"BOARD  = CCJ"语句。$5为NULL,不执行语句。$6为s3c24x0,添加"SOC  =s3c24x0"所以,如果你尝试着执行config.mk文件一定会出现如下信息:

ARCH = arm CPU = arm920t BOARD = CCJ
SOC = s3c24x0

  接下来看第二段代码,根据作者提供的注释我们知道要创建开发板指定头文件了。根绝最开始mkconfig中我们定义的APPEND值,执行语句,由于这里我定义的是APPEND=no,所以执行else分支,创建config.h头文件,并添加  /* Automatically generated - do not edit */    #include <configs/$1.h>  语句到config.h头文件中。 最后执行 exit 0 退出mkconfig文件。

2.u-boot的编译

  接下来我们要做的就是编译了,即make。我们回到Makefile文件,看与你所使用的硬件平台相关的代码,这里我使用的是ARM9。根据注释,可以得知这段代码用于载入架构,开发板信息,CPU的配置。

# 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

  在包含了我们之前所配置的config.mk文件后,Makefile代码就会根据我们配置的具体架构信息选择合适的交叉编译,很明显,因为我的是ARM架构,这里CROSS_COMPILE=arm-linux-。

export CROSS_COMPILE # load other configuration include $(TOPDIR)/config.mk

  接着往下看,最下面我们包含了顶层目录下的config.mk文件。其实这里我发现有一个问题,就是之前我们不是也生成了一个config.mk吗?这其实是两个文件。之前那个完完全全是我们自己创建的config.mk,它的作用就是为了给接下来包含的这个原作者书写的config.mk传值,传递CPU、SOC、ARCH、BOARD、VENDOR的参数值。如果你手头上有下载好的u-boot源文件,打开u-boot文件夹,你就会看到一个config.mk。打开它就明白我刚刚所说的,传递的参数进入这个config,mk配置交叉编译选项、选择结构依赖规则。如下图:

ifeq ($(ARCH),arm) ifeq ($(CROSS_COMPILE),powerpc-netbsd-) PLATFORM_CPPFLAGS+= -D__ARM__ endif ifeq ($(CROSS_COMPILE),powerpc-openbsd-) PLATFORM_CPPFLAGS+= -D__ARM__ endif endif ifeq ($(ARCH),blackfin) PLATFORM_CPPFLAGS+= -D__BLACKFIN__ -mno-underscore endif ifdef ARCH sinclude $(TOPDIR)/$(ARCH)_config.mk # include architecture dependend rules endif ifdef CPU sinclude $(TOPDIR)/cpu/$(CPU)/config.mk # include CPU specific rules endif ifdef SOC sinclude $(TOPDIR)/cpu/$(CPU)/$(SOC)/config.mk # include SoC specific rules endif

  在这个文件中,也有调用结构依赖规则,就是你所用的硬件架构对应的结构规则config文件,这里不再详述。可以自己打开看看。

  

boot的配置、编译及链接

  接下来接着看Makefile的命令:

 

# U-Boot objects....order is important (i.e. start must be first) OBJS = cpu/$(CPU)/start.o OBJS := $(addprefix $(obj),$(OBJS)) LIBS = lib_generic/libgeneric.a LIBS += board/$(BOARDDIR)/lib$(BOARD).a LIBS += cpu/$(CPU)/lib$(CPU).a ifdef SOC LIBS += cpu/$(CPU)/$(SOC)/lib$(SOC).a endif LIBS += lib_$(ARCH)/lib$(ARCH).a LIBS += fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a

  首先是目标文件start.o,然后是给LIBS变量指定平台/开发板相关的库。这些库是由各个模块自身编译生成的。(.a文件)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/02a147e205bfd8c772bc4ed685dc349f.html