http://guliqun1983.blog.163.com/blog/static/501116852011730535314/
全部博文(120)
分类: 嵌入式
2011-04-08 11:19:46
前提:自带的是gcc-4.4.1无法用crosstool正常编译交叉编译器,所以必须安装gcc-4.1,但是不必卸载4.4.1。方法是::
1. 先安装gcc-4.1,sudo apt-get gcc-4.1
2. sudo rm /usr/bin/gcc
3.sudo ln -s /usr/bin/gcc-4.1 /usr/bin/gcc
(建立GCC到gcc-4.1的软连接)
Ubuntu 9.10编译交叉编译工具时会出现下面的错误:
These critical programs are missing or too old: as ld
错误分析:
通过字面分析可知,重要的程序丢失,或者,版本太老,具体的程序名字为:as ld,很多朋友遇到这儿的时候会很郁闷,版本太老???我们的9.10已经是比较新的系统了,怎么可能还老呢,crosstool工具到现在还是 0.43,其最后更新时间不超过2008年,这是怎么回事呢?
我们先来看下as ld的版本:
sudo as -v
GNU assembler version 2.20 (i486-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.20
sudo ld -v
GNU ld (GNU Binutils for Ubuntu) 2.20
从上面的信息可知,两个版本都是2.20, 在看下.dat文件里的要求的各版本信息:
BINUTILS_DIR=binutils-2.16.1
GCC_CORE_DIR=gcc-3.3.6
GCC_DIR=gcc-4.1.1
GLIBC_DIR=glibc-2.3.6
LINUX_DIR=linux-2.6.15.4
LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.6
GDB_DIR=gdb-6.5
从上面可知,binutils的版本(as ld 二者都在binutils包里)要求为2.16.1,可见我们的程序版本要高的。
分析下出错的脚本位置:
cd ./build/arm-linux/gcc-3.4.5-glibc-2.3.6/glibc-2.3.6$ (有人可能会问,你怎么知道是在这儿的呢)
方法很简单: 1. 用grep 2. 通过分析脚本信息得出
在第3920行左右:
ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
2.1[3-9]*)
其大概意思就是,判断当前das程序的版本信息,如果其版本不是2.13~2.19版本之间的版本,就出错。
第3981行,同样的道理:
ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
2.1[3-9]*)
我们将其改为
ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
2.2[0-9]*)
然后保存退出,这样的话还有一个问题,all.sh会每次都去解压glibc的包,会将修改的内容覆盖掉掉,因此还要修改all.sh脚本:
在第110行左右,将下面的内容注释掉:
if test "$opt_no_unpack" = ""; then
if test "$opt_builduserland" = "1"; then
# Ah, nobody would want to change this :-)
PTXDIST_DIR=ptxdist-testing-20031113
export PTXDIST_DIR
fi
# Download and patch
if test -d "$BUILD_DIR"; then
# Remove in background
mv $BUILD_DIR $BUILD_DIR.del.$$
rm -rf $BUILD_DIR.del.$$ &
fi
mkdir -p $BUILD_DIR
sh getandpatch.sh
fi
然后在编译:
./demo-arm-softfloat.sh
大概要等1个小时左右时间,就能看到echo Done了。
说明:这种做法比较危险,因为不知道as ld两个不同版本程序之间的区别,我简单测试了下arm-linux-gcc是没有问题的,但是不知道会不会有其它影响。