出现问题:
……………….
……………….
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
make: *** [u-boot] Error 1
问题是“软硬浮点”,需要自己建立交叉工具链。
1.下载crosstool :http://kegel.com/crosstool/crosstool-0.43.tar.gz
2.下载完毕源码包之后,使用root用户登录,然后新建目录:/opt/crosstool,然后将其所有者修改为您的普通用户chown jelly /opt/crosstool
3.在目录/home/jelly目录下面新建目录downloads,然后复制crosstool-0.28.tar.gz到downloads目录下。
4.进入到目录/opt/crosstool下面:cd /opt/crosstool,解压之前下载的crosstool-0.28.tar.gz文件:
tar xvfz /home/coolber/downloads/crosstool-0.28.tar.gz -C /opt/crosstool。
5.解压完毕后,进入crosstool-0.28目录,然后执行:sh demo-arm-softfloat.sh就可以开始制作编译器。
中间如果缺少什么安装包 直接用命令安装:sudo apt-get install 安装包名字
6.然后会在默认的/opt/crosstool/目录下面产生一个名为arm-softfloat-linux-gnu的目录,它下面就是刚刚编译成功的交叉编译器。
修改PATH:在命令行下执行 export PATH=/opt/crosstool/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux-gnu/bin/:$PATH
7.然后进入u-boot-1.2.0目录,修改Makefile文件,将使用的交叉编译器从arm-linux-改为arm-softfloat-linux-gnu-
重新编译u-boot。
安装交叉工具链时遇到的问题:
问题一
……………….
……………….
applying patch /home/rookiesean/workspace/crosstool-0.43/patches/glibc-2.3.6/arm-ctl_bus_isa.patch
getandpatch.sh: 1: patch: not found
patch /home/rookiesean/workspace/crosstool-0.43/patches/glibc-2.3.6/arm-ctl_bus_isa.patch failed
解决方法: sudo apt-get install patch
问题二
…………………………
…………………………
/home/rookiesean/workspace/crosstool-0.43/crosstool.sh: 110: bison: not found
crosstool: You don’t have bison installed
解决方法:sudo apt-get install bison
问题三
………………………..
………………………..
configure: error:
*** These critical programs are missing or too old: as ld
*** Check the INSTALL file for required versions.
问题说明:Ubuntu默认所安装的binutils版本为binutils-2.20,当binutils太新的时候,crosstool只好将它当成太老的版本,报告说too old; as ld. 于是我们需要重新编译安装一个老版本的binutils,2.19或者2.18都可以被crosstool所识别,这里拿binutils-2.18举例。但还有一个问题,Ubuntu10.04默认安装的gcc版本是gcc-4.4.3,跟binutils-2.20一样,太高版本的gcc对语法要求更为严格,这样会导致binutils-2.18无法轻松的编译通过,于是我们需要编译安装一个老版本的gcc,4.1的版本可以编译成功binutils-2.18。在Ubuntu10.04可以通过。
解决方法:
1.安装gcc4.1
sudo apt-get install gcc-4.1
cd /usr/bin
sudo rm gcc
sudo ln -sf gcc-4.1 gcc
gcc -v
2.安装binutils
1)下载binutils 2.18 http://ftp.gnu.org/gnu/binutils/ 注意这里binutils版本要在2.20以下 否则会有问题
详见:http://blog.csdn.net/wjl_hdu/article/details/6938311
2)将其解压缩后,进入binutils顶层目录,运行:
./configure –prefix=/home/jelly/temp/binutils –disable-nls
make all
make install
3)编译成功后在/home/jelly/temp/binutils/bin/中就生成了ld as程序的可执行文件, 到/usr/bin目录下面将系统默认的ld和as替换成2.18版本的:
cd /usr/bin
sudo rm as ld
sudo ln -sf /home/rookiesean/temp/binutils/bin/ld ld
sudo ln -sf /home/rookiesean/temp/binutils/bin/as as
ld -v; as -v
得到如下显示:
GNU ld (GNU Binutils) 2.18
GNU assembler version 2.18 (i686-pc-linux-gnu) using BFD version (GNU Binutils) 2.18
表示系统默认的binutils版本已经变换为2.18版本。
4)运行demo-*.sh建立属于自己的交叉编译器
注意: 还会出现一个错误。
file included from version.c:33:
/home/rookiesean/workspace/crosstool-0.43/build/arm-9tdmi-linux-gnu/gcc-3.4.5-glibc-2.3.6/build-glibc/csu/version-info.h:2: error: missing terminating ” character
/home/rookiesean/workspace/crosstool-0.43/build/arm-9tdmi-linux-gnu/gcc-3.4.5-glibc-2.3.6/build-glibc/csu/version-info.h:3: error: missing terminating ” character
version.c:40: error: syntax error before string constant
make[2]: *** [/home/rookiesean/workspace/crosstool-0.43/build/arm-9tdmi-linux-gnu/gcc-3.4.5-glibc-2.3.6/build-glibc/csu/version.o] 错误 1
make[2]:正在离开目录 `/home/rookiesean/workspace/crosstool-0.43/build/arm-9tdmi-linux-gnu/gcc-3.4.5-glibc-2.3.6/glibc-2.3.6/csu’
make[1]: *** [csu/subdir_lib] 错误 2
make[1]:正在离开目录 `/home/rookiesean/workspace/crosstool-0.43/build/arm-9tdmi-linux-gnu/gcc-3.4.5-glibc-2.3.6/glibc-2.3.6′
make: *** [lib] 错误 2
问题说明:老版本的glibc在/bin/sh为dash的时候会出现这个问题,一种解决方法是把/bin/sh重定向为bash,在创建完交叉编译器后可以将/bin/sh重新改回dash,运行如下面命令修改/bin/sh:
解决方法:
cd /bin
sudo mv /bin/sh sh.old
sudo ln -sf bash /bin/sh
sh –version
得到如下显示:
GNU bash, version 4.1.5(1)-release (i486-pc-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.