uboot移植参考说明:
该移植有部分移植参考互联网资源,如有侵权,请与我联系。大部分为自己原创,如有转载请注明出处,该技术仅供学习交流,不可商用。------小盒子 于哈尔滨2009年03月10日整理
这里介绍一下有关编译器的问题,如果你使用的交叉编译器版本不是3.4.1,你可以跳过此节。注意使用3.3.2版本的也需要看一下,后面有一个小地方需要修改一下。
如果你使用的是3.4.1在编译u-boot的时候大多数人会遇到以下这样的错误,这个时候你别紧张,这里给你提供了一个好的解决办法:
rm-linux-ld:ERROR:usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/libgcc.a(_udivdi3.oS) uses hardware FP, whereas u-boot uses software FP
arm-linux-ld:failed to merge target specific data of file /usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/libgcc.a(_udivdi3.oS)
arm-linux-ld: ERROR: /usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/libgcc.a(_clz.oS) uses hardware FP, whereas u-boot uses software FP
arm-linux-ld: failed to merge target specific data of file /usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/libgcc.a(_clz.oS)
make: *** [u-boot] Error 1
解决的办法:
找到/u-boot-1.1.4/cpu/arm920t/config.mk文件
该文件内容如下所示:
PLATFORM_RELFLAGS += -fno-strict-aliasing -fno-common -ffixed-r8 \
-msoft-float
PLATFORM_CPPFLAGS += -march=armv4
# =========================================================================
#
# Supply options according to compiler version
#
# =========================================================================
PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,-mabi=apcs-gnu)
PLATFORM_RELFLAGS +=$(call cc-option,-mshort-load-bytes,$(call cc-option,-malignment-traps,))
修改该文件:
PLATFORM_RELFLAGS += -fno-strict-aliasing -fno-common -ffixed-r8 \
# -msoft-float
PLATFORM_CPPFLAGS += -march=armv4
# =========================================================================
#
# Supply options according to compiler version
#
# =========================================================================
PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32)#,-mabi=apcs-gnu)
PLATFORM_RELFLAGS +=$(call cc-option,-mshort-load-bytes,$(call cc-option,-malignment-traps,))
请注意紫色部分的修改!
问题是编译链接器3.4.1用的是hardware FP,而u-boot 使用的是 software FP 也可以使用2.95或者3.3.2版本可解决这个问题。
如果使用3.3.2编译器编译出错的话
编译错误:error: invalid option `abi=apcs-gnu'
出错原因:
指示编译器不支持选项 -mabi=apcs-gnu
出错的文件是/cpu/arm920t/下的config.mk
函数cc-option用于检查编译器是否支持给定的选项
在PLATform_CPPFLAGS +=$(call cc-option,-mapcs-32,-mabi=apcs-gnu)中
apcs:指的是 ARM 过程调用标准
apcs-32和apcs-gnu是APCS 标准中的两个版本。
在上边脚本中cc-option首先检查是否支持apcs-32标准,如果不支持的话就使用apcs-gnu标准,而3.3.2 arm-linux-gcc也不支持apcs-gnu标准,所以出错。而PLATform_CPPFLAGS +=$(call cc-option,-mapcs-32,$(call cc-option,-mabi=apcs-gnu,))
脚本中如果给定的两个标准都不支持的话就不指定了。
如果你用的是3.3.2版本你可以按照我的修改
PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32)#,-mabi=apcs-gnu)
PLATFORM_RELFLAGS +=$(call cc-option,-mshort-load-bytes,$(call cc-option,-malignment-traps,))
连载三先到这里吧,这里解决了有关交叉编译环境版本与u-boot编译参数配置的问题。下面请关注《【原创】u-boot移植-->连载四》开始修改源码。
PS:自从《【原创】u-boot移植-->连载二》写完之后没几天,我生活发生一些变化,导致我的心思没能放到这里来,最后忘记了连载的问题,这里小盒子谢谢北京这位朋友的提醒!