一。 保证ubuntu 上安装如下软件包
Bison
flex
build-essential
patch
libncurses5-dev
查看该软件包的依赖关系,可以看到以下内容:
$ apt-cache depends build-essential
安装软件包使用 $sudo apt-get install 软件包名
二。 Crosstool
Crosstool 是一组脚本工具集,可构建和测试不同版本的gcc和glibc,用于那些支持glibc的体系结构。它也是一个开源项目,下载地址是http: //kegel.com/crosstool。用Crosstool构建交叉工具链要比分步编译容易得多,并且也方便许多,对于仅仅为了工作需要构建交叉编译工具链的读者建议使用此方法。用Crosstool工具构建所需资源下所示。
表2.2 所需资源
安装包
下载地址
crosstool-0.43.tar.gz
http://kegel.com/crosstool
linux-2.6.15.4.tar.gz
ftp.kernel.org
binutils-2.16.1.tar.bz2
ftp.gnu.org
gcc-3.3.6.tar.gz
ftp.gnu.org
gcc-4.1.tar.gz
ftp.gnu.org
glibc-2.3.2.tar.gz
ftp.gnu.org
glibc-linuxthreads-2.3.2.tar.gz
ftp.gnu.org
linux-libc-headers-2.6.12.0.tar.bz2
ftp.gnu.org
gdb6.5.tar.bz2
三。crosstoo 安装基本步骤
1.准备资源文件
首先从网上下载所需资源文件,然后将这些工具包文件放在新建的$HOME/downloads目录下,最后在$HOME/downloads目录下解压crosstool-0.43.tar.gz,命令如下:
# cd /home/zhoug/downloads(注$HOME = /home/zhoug)
# tar –xzvf crosstool-0.42.tar.gz
(
对于tar.bz2的文件,其解压命令
#tar -xjvf xxx.tar.bz2
)
2.建立脚本文件
# cd HOME/downloads/crosstool0.43
# cp demo-arm9tdmi.sh arm.sh
# sudo gedit arm.sh
#!/bin/sh
# This script has one line for each known working toolchain
# for this architecture. Uncomment the one you want.
# Generated by generate-demo.pl from buildlogs/all.dats.txt
set -ex
TARBALLS_DIR=$HOME/downloads #资源下载目录
RESULT_TOP=/opt/crosstool #编译工具最终生成目录
export TARBALLS_DIR RESULT_TOP
GCC_LANGUAGES="c,c++" # 定义支持C, C++语言
export GCC_LANGUAGES
# Really, you should do the mkdir before running this,
# and chown /opt/crosstool to yourself so you don't need to run as root.
mkdir -p $RESULT_TOP
#eval `cat arm9tdmi.dat gcc-3.2.3-glibc-2.2.5.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.2.3-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.2.3-glibc-2.3.2-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.3.6-glibc-2.2.5.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.3.6-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.3.6-glibc-2.3.2-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.2.5.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.2-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.5.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.5-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.6.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.6-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.2-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.5.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.5-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.6.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.6-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.1.0-glibc-2.3.2.dat` sh all.sh --notest
eval `cat arm9tdmi.dat gcc-4.1.0-glibc-2.3.2-tls.dat` sh all.sh --notest --nounpack
echo Done
3..建立配置文件
# gedit arm9tdmi .dat
----------------------------------------------------------------------------------------------------------
KERNELCONFIG=`pwd`/arm.config
TARGET=arm-linux # 编译生成的工具链名称
GCC_EXTRA_CONFIG="--with-cpu=arm9tdmi --enable-cxx-flags=-mcpu=arm9tdmi"
TARGET_CFLAGS="-O"
----------------------------------------------------------------------------------------------------------
# gedit gcc-4.1.0-glibc-2.3.2-tls.dat
BINUTILS_DIR=binutils-2.16.1
GCC_CORE_DIR=gcc-3.3.6
GCC_DIR=gcc-4.1.0
GLIBC_DIR=glibc-2.3.2
LINUX_DIR=linux-2.6.15.4
LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2
GDB_DIR=gdb-6.5
GLIBC_EXTRA_CONFIG="$GLIBC_EXTRA_CONFIG --with-tls --with-__thread --enable-kernel=2.4.18"
----------------------------------------------------------------------------------------------------------
4.执行脚本
将Crosstool的脚本文件和配置文件准备好之后,开始执行arm.sh脚本来编译交叉编译工具。具体执行命令如下:
# cd crosstool-0.43
# ./arm.sh
5.设置环境变量
# sudo gedit /etc/bash.bashrc
export PATH=$PATH:/opt/crosstool/gcc-4.1.0-glibc-2.3.2/arm-linux/bin:
四。编译中出现的错误
1. 我机器上的gcc 版本是gcc 4.3.3 ,进行编译时出错。
gcc 版本高或低,sudo apt-get remove gcc ,sudo apt-get install gcc-4.1 。由于ubuntu 可以安装多种版本的gcc.我只执行
sudo apt-get install gcc-4.1。
安装gcc-4.1后
sudo rm /usr/bin/gcc (删除GCC,它只是个到gcc-4.3.2的软连接文件)
sudo ln -s /usr/bin/gcc-4.1 /usr/bin/gcc (建立GCC到gcc-4.1的软连接)
2. 错误如下:
make[2]: *** [/home/zhoug/downloads/crosstool-0.43/build/arm-linux/gcc-4.1.0-glibc-2.3.2/build-glibc/csu/version.o] 错误 1
bash: make[2]::找不到命令
make[2]:正在离开目录 `/home/zhoug/downloads/crosstool-0.43/build/arm-linux/gcc-4.1.0-glibc-2.3.2/glibc-2.3.2/csu'
make[1]: *** [csu/subdir_lib] 错误 2
make[1]:正在离开目录 `/home/zhoug/downloads/crosstool-0.43/build/arm-linux/gcc-4.1.0-glibc
解决方法:
修改如下文件:
gedit /crosstool0.43/build/arm-linux/gcc-4.1.0-glibc-2.3.2/build-glibc/csu/version-info.h
"Available extensions:/n"
"/n"
vim Demo-arm.sh
在工具链版本后加 --notest --nounpack
3.网上介绍的其他错误
1)《安装gcc后》安装了gcc-4.1之后,重新编译。心想这回好了吧?!不想,有出了以下错误:
In file included from version.c:33:
/home/tekkaman/working/crosstool-0.43/build/arm-9tdmi-linux-gnu/gcc-4.1.1-glibc-2.3.2/build-glibc/csu/version-info.h:2:1: missing terminating " character
/home/tekkaman/working/crosstool-0.43/build/arm-9tdmi-linux-gnu/gcc-4.1.1-glibc-2.3.2/build-glibc/csu/version-info.h:3:1: missing terminating " character
google后发现,原来是ubuntu将系统默认的shell设置成了dash (the Debian Almquist Shell),所以通过脚本生成的文件格式和bash的不一样,导致了编译错误。在使用了
ursa
的方法后问题解决。
sudo mv /bin/sh /bin/sh.old
sudo ln -sf bash /bin/sh
2)今天在编译skyeye时又报错
/usr/include/bits/fcntl2.h:51: 错误: 调用‘__open_missing_mode’,声明有错误属性:open with O_CREAT in second argument needs 3 arguments
按理说在Fedora 10中都可以编译过的,在ubuntu下应该也没什么问题才对,可是偏偏出现这个问题。赶紧跟踪,首先对比两个版本的/usr/include/bits/fcntl2.h,发现没有区别,那么就是代码的问题了。改代码,报错是在612行
if(!nf->writebuffer)
free(nf->writebuffer);
free(nf);
提示是open有错,但是612行是free,注释掉前两行,居然误报成了free(nf),继续注释掉free(nf),终于,错误给出来了,是在519行的 if ((nf->fdump= open(dev->dump, FILE_FLAG)) 0)
open在调用的时候只有两个参数,赶紧给加上个0777,代码成了 if ((nf->fdump= open(dev->dump, FILE_FLAG,0777)) 0)
谢天谢地,终于编译通过了。
遇到arm-linux-ar堆栈溢出的问题
主要是4.3.2编译器的问题,改为4.1的编译器即可