6. 初步编译
终于可以尝试编译了,这里关于交叉编译器的设置就不做介绍了,相信大家应该都会的,只不过需要注意的是高版本的u-boot同样需要高版本的编译器。
好的,执行如下命令,指定编译器、cpu架构,开始进行编译,
但是,又有问题了,根据上述信息,我们还需要配置CONFIG_SYS_TEXT_BASE,这是u-boot的链接地址,我们编译好u-boot后要把可执行文件复制到内存的这个地址上才行,好,我们在jz2440_defconfig中加上这个配置,
CONFIG_ARM=y
CONFIG_TARGET_JZ2440=y
CONFIG_SYS_TEXT_BASE=0x33f00000
然后重新配置编译,

嗯,已经可以进行正常编译了。
终于出现错误了,

上述编译信息表明,我们需要定义两个宏:
- CONFIG_SYS_MALLOC_LEN,表明u-boot使用malloc函数时的堆内存大小;
- CONFIG_SYS_LOAD_ADDR,表明u-boot的source命令运行脚本时脚本在sdram的位置,看来虽然我们没有选择这个命令,但是u-boot已经默认为我们加上了。
好的,我们在jz2440.h中加入以上两个宏定义,
/* SPDX-License-Identifier: GPL-2.0+ */
/*
* (C) Copyright 2020 Asymptote
*
* Configuation settings for the SAMSUNG JZ2440 board.
*/
#ifndef __CONFIG_JZ2440_H
#define __CONFIG_JZ2440_H
#define CONFIG_SYS_LOAD_ADDR 0x30800000
#define CONFIG_SYS_MALLOC_LEN (4 * 1024 * 1024)
#endif /* __CONFIG_JZ2440_H */
这里为了方便,我将清理,配置,编译三个命令写成了一个build.sh脚本放到u-boot工程的根目录,以后调试会方便些,
make distclean
make jz2440_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j8
然后,./build.sh,到最后链接的时候还是有错误,
我们首先解决第一个CONFIG_SYS_INIT_SP_ADDR宏定义的问题,这个宏的功能是指定c函数使用的栈的地址,我们在jz2440.h中加入这个宏定义,
/* SPDX-License-Identifier: GPL-2.0+ */
/*
* (C) Copyright 2020 Asymptote
*
* Configuation settings for the SAMSUNG JZ2440 board.
*/
#ifndef __CONFIG_JZ2440_H
#define __CONFIG_JZ2440_H
#

本文详细介绍了U-Boot的编译流程及定制过程,包括配置编译器、设置CPU架构、解决编译错误、定义宏、实现未定义函数等关键步骤。通过具体实例,如jz2440_defconfig配置、CONFIG_SYS_TEXT_BASE设置、CONFIG_SYS_MALLOC_LEN定义,以及reset_cpu、lowlevel_init等函数的实现,展示了如何解决编译过程中遇到的各种问题。
最低0.47元/天 解锁文章
1116

被折叠的 条评论
为什么被折叠?



