分类:
2012-05-15 21:29:11
原文地址:u-boot编译笔记 作者:iibull
比较多的arm-linux-gcc版本包有:
arm-linux-gcc-2.95.3.tgz
arm-linux-gcc-3.3.2.tar.bz2
arm-linux-gcc-3.4.1.tar.bz2
这几个包在网上都比较容易下载到,由于在3.4.1版本中使用的是硬浮点,对
于u-boot使用软浮点来说不适合。可以使用较低版本来编译u-boot。我使用的
是arm-linux-gcc-3.3.2.tar.bz2。
我使用的是debian5.0
错误记录:
1.使用arm-linux-gcc-3.4.1软浮点报错:
lib_arm/libarm.a(_udivsi3.o)(.text+0x8c):/home/qsg/u-boot-
1.2.0/lib_arm/_udivsi3.S:67: relocation truncated to fit:
R_ARM_PLT32 __div0
lib_arm/libarm.a(_umodsi3.o)(.text+0xa8):/home/qsg/u-boot-
1.2.0/lib_arm/_umodsi3.S:79: relocation truncated to fit:
R_ARM_PLT32 __div0
{
这是因为你用的编译的版本不一致,
你的uboot里面指定了 -msoft-float 编译选项, 是软浮点的,
但是你连接的gcc库是用的硬浮点的,
解决办法
1, 把uboot里面的Makefile里面的 “-msoft-float”去掉;
或者
2,换一个soft float软浮点的 工具链;
I know there is a link error happened when the arm-linux ld want
to link two different types of libs.
编译使用的是arm-linux-gcc-3.4.1.tar.bz2,可能由于glibc使用
Hardware FP,而U-boot使用的是
Software FP,所以无法正确链接,可能要将glibc用Software FP的方法
重新编译,怎样重新编译呢?
有人建议编译u-boot的时候用2.95.3 编译内核时用3.4.1
在网上找google 了一会,发现什么patch to fix the problem,可惜看
不懂这个补丁。
无奈之下只好grep R_ARM_PLT32 -r u-boot根目录,就是找不到哪个文件
里有这个参数。
}
别人出现过的错误以及修改方法:
错误二:
make[1]: *** 没有规则可以创建“libmy2410.a”需要的目标“smdk2410.o”
。 停止。
make[1]: Leaving directory `/home/tom/u-boot-1.1.4/board/my2410'
make: *** [board/my2410/libmy2410.a] 错误 2
解决方法:
修改board/my2410/Makefile
将28行的
OBJS := smdk2410.o flash.o
改为
OBJS := my2410.o flash.o
错误三:
isystem /usr/local/arm/bin/../lib/gcc-lib/arm-linux/3.2/include
-pipe -DCONFIG_ARM -D__ARM__ -march=armv4 -mtune=arm7tdmi -msoft-
float -mabi=apcs-gnu -Uarm -Wall -Wstrict-prototypes -c -o
hello_world.o hello_world.c
cc1: invalid option `abi=apcs-gnu'
出错的文件是/cpu/arm920t/下的config.mk:将
PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,-mabi=apcs-gnu)
改成:
PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,$(call cc-option,-
mabi=apcs-gnu),)
错误四:
把编译好的uboot烧进nand flash不能运行,什么反应都没有,
看来还是要从代码改起
原来是没有加nand flash的驱动,烧进nand flash不能运行,
烧进nor flash 可以运行了,不过命令提示符是
smdk2410,看看在哪儿可以改为自己定义的
Bug 1
cc1: error: invalid option `abi=apcs-gnu'
------------------------------------------------------------------
1)改用GCC为arm-linux-gcc-3.4.1.tar.bz2即可. 或者:
2)出错的文件是/cpu/arm920t/下的config.mk:
将
PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,-mabi=apcs-gnu)
改成:
PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,$(call cc-
option,-mabi=apcs-gnu),)
Bug 2
make[1]: *** 没有规则可以创建“all”需要的目标“hello_world.srec”。
停止。
------------------------------------------------------------------
make[1]: Leaving directory `/home/a-ki/at91rm9200/u-boot-
1.1.4/examples'
make: *** [examples] 错误 2
在网上查了查,有人说是make 3.81的一个BUG!
=TrackerItemEdit&tracker_item_id=1324
可以简单的改一个目录examples下的Makefile来解决:
vi examples/Makefile
#SREC = hello_world.srec
#BIN = hello_world.bin hello_world
SREC = hello_world.o
BIN = hello_world.o hello_world
===========================================================
下载了uboot的目录结构如下所示
目录 内容
Board 和一些已有开发板有关的文件. 每一个开发板都以一个子
目录出现在当前目
录中,比如说:SMDK2410,子目录中存放与开发板相关
的配置文件.
Common 实现uboot命令行下支持的命令,每一条命令都对应一个文
件。例如go命令对
应就是cmd_boot.c
Cpu 与特定CPU架构相关目录, 每一款uboot下支持的CPU在
该目录下对应一个子 目录,比如有子目录arm920t等。
Disk 对磁盘的支持
Doc 文档目录。uboot有非常完善的文档,推荐大家参考阅读。
drivers uboot支持的设备驱动程序都放在该目录,比如各种网卡、
支持CFI的Flash、串口和USB等。
Fs 支持的文件系统,uboot现在支持cramfs、fat、fdos、jffs2和
registerfs。
uboot使用的头文件,还有对各种硬件平台支持的汇编文件,系统的配
置文件
和对文件系统支持的文件。 该目录下configs目录有与开发板
相关的配置头文
include
件,如smdk2410.h。该目录下的asm目录有与CPU体系结构相关的头文
件,asm
对应的是asmarm.
lib_xxxx 与体系结构相关的库文件。如与ARM相关的库放在lib_arm中。
Net 与网络协议栈相关的代码,BOOTP协议、TFTP协议、RARP协议和NFS文
件系统
的实现。
Tools Uboot的工具,如:mkimage, crc等等。
===========================================================
编译记录:
1.u-boot官方网下载:
http://www.icdev.com.cn/batch.viewlink.php?itemid=1694
2.现在我们要自己在uboot的目录里加一点自己的东西好定制自己的板子)'_'
(
先给我们的板子取一个名字,就叫my2410吧,修改主的makefile,加上自己的
配置,可以参照arm已知的配置
my2410_config : unconfig
@./mkconfig $(@:_config=) arm arm920t my2410 NULL s3c24x0
各项的意思如下:
arm:CPU的构架(ARCH)
arm920t:CPU的类型(CPU),对应于cpu/arm920t子目录
my2410:开发板的型号(BOARD),对应一会儿要创建的board/my2410 目录
NULL:开发者或经销商(vender)
s3c24x0:片上系统(SOC)
3.现在在board目录下创建自己的板子目录
board/my2410
cp board/smdk2410/* board/my2410/ ##直
接拿过来用^_~
cd board/my2410
mv smdk2410.c my2410.c ##名字
也改一下,不然通不过编译
4.在my2410的目录下有一个Makefile文件,有一句修改为:
COBJS := my2410.o flash.o
5.在include/configs/中建立配置头文件:
cp include/configs/smdk2410.h
include/configs/my2410.h
6.编译之前,先
make distclean #做一下清除工作,主要是删除
一些链接文件
7.如果前面被编译过请执行
make clean
8.配置编译环境
make my2410_config ##这个my2410_config就是
我们自己加到makefile中去的^__^
这时应该出现
Configuring for my2410 board...
表明没问题
9.编译
make CROSS_COMPILE=arm-linux-
不出意外的话,应该编译通过了
编译完成后,可以得到u-boot各种格式的映像文件和符号表
# ls -lh u-boot*
u-boot.bin 118K u-boot映像原始的二进制格式
u-boot 448K u-boot映像的ELF格式
u-boot.srec 354K u-boot映像的S-Record格式
u-boot.map 52K u-boot映像的符号表
u-boot的3种映像格式都可以烧写到Flash中,但需要看加载器能否识别这
些格式。一般u-boot.bin最为常用,直接按照二进制格式下载,并且按照绝对
地址烧写到Flash中就可以了。u-boot和u-boot.srec格式映像都自带定位信息
。
10.编译好后,推荐使用H-jtag烧写。