首先配置Makefile 中的交叉编译工具
CH),$(ARCH))
#CROSS_COMPILE ?= 这里加#进行注释掉
endif
// 添加后面两句
ARCH = arm
CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
首先需要配置, 配置文件看
/configs 文件, 找到相同的芯片或者类似的(同一厂家, 系列的)
make xxx_defconfig
接着 make -j4
报错 lib/asm-offsets.c:1:0: error: bad value (armv5) for -march= switch
也是因为交叉编译工具没有配置好, 所以才会导致的,
编译完成之后, 生成uboot.bin 将其进行烧录, 然后看现象查找问题.
随后需要找到程序的入口, 通过分析u-boot.lds链接脚本文件
发现
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start) // 这个就是程序的入口
SECTIONS
{
. = 0x00000000;
. = ALIGN(4);
.text :
{
*(.__image_copy_start)
*(.vectors)
arch/arm/cpu/armv7/start.o (.text*)
*(.text*)
}
. = ALIGN(4);
.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
. = ALIGN(4);
.data : {
*(.data*)
}
经过搜索, 发现程序的入口在
arch/arm/lib/vector.S文件中
这个和以前接触的其他版本的uboot不一样, 以前的uboot入口是在start.S, 这个版本是在vector.S中,
因此需要注意,
因为需要编译后的在u-boot.bin中添加
16字节的头, 因此
只需要在_start: 一开始处添加空的16字节即可
_start:
.word 0x2000
.word 0x0
.word 0x0
.word 0x0
#ifdef CONFIG_SYS_DV_NOR_BOOT_CFG
.word CONFIG_SYS_DV_NOR_BOOT_CFG
#endif
当编译的时候 ,出现
syntax error
这个是使用了// 进行注释, 解决的方式就是/* 还有 */ 进行注释,
还有 在添加CONFIG_XXX的时候报出
Error: You must add new CONFIG options using Kconfig
The following new ad-hoc CONFIG options were detected:
CONFIG_ARM920T
CONFIG_MINI2440
CONFIG_NAND_S3C2440
CONFIG_RTC_S3C24X0
CONFIG_S3C2440
CONFIG_S3C24X0
CONFIG_S3C24X0_SERIAL
CONFIG_SYS_HUSH_PARSER
CONFIG_SYS_S3C2440_NAND_HWECC
CONFIG_ZERO_BOOTDELAY_CHECK
Please add these via Kconfig instead. Find a suitable Kconfig
file and add a ‘config’ or ‘menuconfig’ option.
解决的方式就是在Makefile 中注释掉
# $(srctree)/scripts/check-config.sh u-boot.cfg \
# $(srctree)/scripts/config_whitelist.txt ${srctree} 1>&2
_TEXT_PHY_BASE 只是在老的版本中的
start.S中定义的
_TEXT_PHY_BASE:
.word CFG_PHY_UBOOT_BASE 根据追踪, 即可看到_TEXT_PHY_BASE: 真实的数据. 这个好像就是物理地址
_TEXT_BASE 在老的版本中是在Makefile 中进行设置的虚拟地址
在uboot.2013.10版本中
.globl _TEXT_BASE
_TEXT_BASE:
.word CONFIG_SYS_TEXT_BASE // 对应的物理地址
在uboot 版本中, 也许是自己没有分析对, 因此, 这里没有找到
_TEXT_BASE 中的定义,
但是在xxx.h 会包含
/* Text Base */
#define CONFIG_SYS_TEXT_BASE 0x34800000 对应的物理地址
因此咱们可以自己模仿2013.10版本中,定义这个_TEXT_BASE变量,将其放在
start.S中即可
.globl _TEXT_BASE
_TEXT_BASE:
.word CONFIG_SYS_TEXT_BASE
我们在清bss段的时候,需要两个变量,
咱们可以这么进行定义
.globl _bss_start
_bss_start:
.word __bss_start
.globl _bss_end
_bss_end:
.word _end
编译报错:
Error: internal_relocation (type: OFFSET_IMM) not fixed up
应该是包含了错误的变量信息