以下内容源于朱有鹏《物联网大讲堂》课程的学习整理,如有侵权,请告知删除。
一、配置编译初体验
1、uboot来源于官方(uboot官网下载),或者SoC官方(研发s5pv210芯片的公司推出的开发板,SMDKV210),或者具体的开发板的官方(深圳市九鼎科技,X210)。
- 这里以针对x210开发板移植好的uboot进行配置、编译和分析。
2、步骤
- 将源码解压在适当的目录下;
- 配置,即在uboot的根目录下执行make x210_sd_config;
- 编译,即在uboot的根目录下执行make(或者make -j2,或者make -s,前者多线程编译,后者静默编译)。
二、uboot的源目录分析
1、包括文件、文件夹。
2、主要的文件有uboot根目录下的mkconfig,Makefile,前者负责uboot的编译,后者负责编译。
3、主要的文件夹有board,cpu、common、include等。board文件夹中每个子文件夹表示一个开发板。cpu文件夹中每个子文件夹都是一个SoC系列。
三、uboot的配置分析
1、配置,即确定所使用的文件夹、文件的路径。
2、总结
(1)在uboot的根目录下执行make x210_sd_config时,x210_sd_config是目标,在主Makefile中有如下代码:
x210_sd_config :unconfig
@$(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110
@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk
- 调用MKCONFIG所表示的脚本,即uboot根目录下的mkconfig脚本;
- 该脚本接收6个参数,分别是x210_sd,arm,s5pc11x,x210,samsung,s5pc110;
- $(@:_config=)表示匹配后面带有_config的参数,并取除去_config的部分,即取x210_sd。
(2)在mkconfig脚本(见博客http://blog.csdn.net/oqqhutu12345678/article/details/73166954)
- 创建符号链接;
- 创建include/config.mk文件;注意这里的config.mk不是根目录下的config.mk文件;
- 创建include/config.h文件。
(3)创建include/config.mk文件是为了让主Makefile在第133行包含。(见四7)
(4)include/config.h文件中,仅有一行代码:#include<configs/x210_sd.h>
- 这里的configs是include文件夹里的一个子文件夹;
- configs下的每个文件对应一个开发板的头文件,它是一些宏定义配置文件,是移植时最主要的文件。
- 其中x210_sd.h被用来生成autoconfig.mk文件。
- autoconfig.mk文件被主Makefile引入,指导整个编译过程,此文件中的宏会影响uboot中的大部分.C文件中的一些条件编译的选择,从而实现最终的可移植性。
四、uboot的主Makefile分析
1、uboot的版本号(24~29行)
VERSION = 1
PATCHLEVEL = 3
SUBLEVEL = 4
EXTRAVERSION =
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
VERSION_FILE = $(obj)include/version_autogenerated.h
2、(1)export HOSTARCH HOSTOS,HOSTARCH 、 HOSTOS分别表示主机的CPU架构和操作系统;
(2) | 表示管道?
3、静默编译:make -s
- -s表示参数,silent执行(50~54行)
4、2种编译管理方法(78~123行)
(1)原地编译:编译得到的文件和源文件在同一个目录下,简单但是会污染源目录;
(2)单独文件夹输出的编译:设置一个输出目录,承载编译输出结果。
(3)默认原地编译。
(4)指定具体的输出目录方法
- a、编译时,用make O=输出目录;
- b、或者先export BUILD_DIR=输出目录,然后编译时直接make。
5、OBJTREE,SRCTREE,TOPDIR
- 三者分别表示编译后,.o文件存放的目录的根目录( \root\uboot\ ),源码目录的根目录(\root\uboot\),顶层目录。原地编译时,前者和中者目录是相等的。
6、MKCONFIG(101行):是Makefile中定义的一个变量,值为源码根目录下的mkconfig,而mkconfig是一个脚本。
7、$(obj)include/config.mk(主Makefile中的133行)
- include/config.mk文件是在配置阶段生成的,见本文的三2(2)。 此文件的内容如下:
ARCH = arm
CPU = s5pc11x
BOARD = x210
VENDOR = samsung
SOC = s5pc110
- 配置值来自主Makefile第2589行的配置项里的传参;
- 在主Makefile中的134行将这些变量export出来作为环境变量。
8、ARCH和CROSS_COMPILE(主Makefile中的136~182行)
- 这两个是环境变量;
- ARCH定义为当前编译的目标的CPU架构,在这里是ARM;
- CROSS_COMPILE定义交叉编译工具的前缀;
---------------------------------------------根目录下的config.mk文件-----------------------------------------------------------------
见博客http://blog.csdn.net/oqqhutu12345678/article/details/73167054
9、include $(TOPDIR)/config.mk(主Makefile中的185行)
- 这是根目录下的config.mk文件,不是include/config.mk
10、编译工具定义(根目录下的config.mk文件中的94~107行)
AS= $(CROSS_COMPILE)as
LD= $(CROSS_COMPILE)ld
CC= $(CROSS_COMPILE)gcc
CPP= $(CC) -E
AR= $(CROSS_COMPILE)ar
NM= $(CROSS_COMPILE)nm
LDR= $(CROSS_COMPILE)ldr
STRIP= $(CROSS_COMPILE)strip
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
RANLIB= $(CROSS_COMPILE)RANLIB
11、包含开发板配置项目(根目录下的config.mk文件中的112行)
(1)代码为
sinclude $(OBJTREE)/include/autoconf.mk(2)autoconf.mk是在配置中自动生成的,参见三2(4),它是一些宏,指导编译进行方向。
(3)原料是include/configs/x210_sb.h,include/configs下的每个头文件对应一个开发板。
12、链接脚本(根目录下的config.mk文件中的142~149行)
(1)如果定义了CONFIG_NAND_U_BOOT,则链接脚本是u-boot-nand.lds,没有定义则链接脚本为u-boot.lds。
- uboot的最终链接地址是在Makefile中用-Ttext xxxx的形式来指定,好像和链接链接脚本没有多大的关联?
(2)实际在board\samsung\x210下的u-boot.lds。见博文http://blog.csdn.net/oqqhutu12345678/article/details/73166096
13、TEXT_BASE(在根目录下的config.mk中的156~158行):为整个uboot链接时指定链接地址。
14、自动推导规则(在根目录下的config.mk中的239~256行)。
-------------------------------------------------------------------------------------------------------------------------------------------------
15、在主Makefile中,第291行出现了整个Makefile的第一个目标ALL,其实我们make时,就是make ALL。
综上所述,整个配置和编译过程涉及的文件主要有:
主目录下的Makefile文件
根目录下的config.mk文件(被主Makefile文件调用)
根目录下的mkconfig文件(配置阶段的配置脚本)。