http://blog.chinaunix.net/space.php?uid=22337711&do=blog&id=1774864
http://blog.chinaunix.net/space.php?uid=20543672&do=blog&id=94369
花了几天时间才把基于crosstool-ng的arm-linux交叉编译环境建立好,其间过程中一路磕磕碰碰,较为辛苦,最终成功完成,倍感欣慰。趁着记忆余温,及时作个总结记录。
之所以用crosstool-ng是因为crosstool-ng是新的用来建立交叉工具链的工具,它是crosstool的替换者。crosstool的gcc版本只能到4.1.1,无法编译版本高于2.6.29的linux内核。而crosstool-ng一直保持着更新,现在最新能够建立 gcc 4.3.2版本,可用来编译最新内核。
系统环境:Fedora12 Linux 2.6.32.21-166
一、下载crosstool-ng
crosstool-ng的下载地址是:http://ymorin.is-a-geek.org/download/crosstool-ng
值得注意的是,下载里最新的crosstool-ng以后,记得在到http://ymorin.is-a-geek.org/download/crosstool-ng/01-fixes/ 看看有没有相应的补丁,有得话一起下载下来。
本次下载的版本是 1.8.1 无 patch。
二、准备crosstool-ng的安装环境
使用crosstool-ng必须安装一些开发应用工具:
bison
flex
texinfo
automake
libtool
patch
gcj
cvs
cvsd
gawk
在Fedora下,可使用命令 $ sudo yum install xxx 依次安装。
注意:在Fedora下安装gcj,单纯用sudo yum install gcj是安装不了的。请使用sudo yum install *gcj命令,然后按Y全部安装,其实只要安装列表中libgcj-x.x.x-x和java--x.x.x-gcj-x.x.x。
然后还要手动安装一下termcap。
tar zxvf termcap-1.3.1.tar.gz
cd termcap-1.3.1
./configure --prefix=/usr
make
make install
三、安装crosstool-ng
$ mkdir ~/croosstool-ng # 在当前用户目录下建立croosstool-ng目录
$ cd ~/croosstool-ng
$ mv /tmp/crosstool-ng-1.8.1.tar.bz2 ./ # 把下载的crosstool-ng软件包放到 crosstool-ng目录中
$ tar -jxvf crosstool-ng-1.8.1.tar.bz2 # 解包
$ cd crosstool-ng-1.8.1 # 进入解压目录
$ patch -p1 < <补丁文件>
# 给crosstool-ng打补丁(如果有)
$ ./configure --prefix=/opt/crosstool-ng # 配置crosstool-ng
$ make # 编译crosstool-ng
$ sudo make install # 安装crosstool-ng
$ echo "PATH=$PATH:/opt/crosstool-ng/bin" >> ~/.bashrc # 为后面调用ct-ng命令增加环境变量
$ source ~/.bashrc
$ ct-ng help
This is crosstool-NG version 1.8.1
Copyright (C) 2008 Yann E. MORIN <yann.morin.1998@anciens.enib.fr>
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
到此,我们已经成功迈出一大步,好戏还在后头,加油~!
四、配置交叉编译工具链
$ cd ~/croosstool-ng
$ mkdir crosstool-ng-1.8.1_build # 建立一个交叉工具链的输出目录
$ mkdir src # 建立保存源码包目录
$ mkdir x-tools # 建立交叉编译器的安装路径
$ cd crosstool-ng-1.8.1_build/
$ cp /opt/crosstool-ng/lib/ct-ng-1.8.1/samples/arm-unknown-linux-gnueabi/crosstool.config .config
$ ct-ng menuconfig
此时会出现crosstool-ng的配置窗口,针对armv4t体系架构,开始对其进行修改配置:
1、已下载好的源码包路径和交叉编译器的安装路径。
Paths and misc options --->
(${HOME}/crosstool-ng/src) Local tarballs directory 保存源码包路径
(${HOME}/crosstool-ng/x-tools/${CT_TARGET}) Prefix directory 交叉编译器的安装路径
2、修改交叉编译器针对的构架
Target options --->
*** Target optimisations ***
(armv4t) Architecture level
(arm9tdmi) Emit assembly for CPU
(arm920t) Tune for CPU
通过查找资料,这个应该是指令集的架构,对于S3C2410/S3C2440,都是ARM920T的核心,架构指令是armv4t,所以,如果要编译2410/2440的,就选armv4t。以此类推S3C6410 ARM1176JZF-S核心 使用的是armv6架构,就选armv6,那么具体都支持哪些架构呢?可以用man gcc来查询,搜索arm,再搜索-march=就可以找到本gcc支持的处理器核心列表了。
3、增加编译时的并行进程数,以增加运行效率,加快编译。
Paths and misc options --->
*** Build behavior ***
(4) Number of parallel jobs
这个数值不宜过大,应该为CPU数量的两倍。由于我的CPU是双核的,所以我填了4.
4、一些个性化的修改(可以不修改)
Toolchain options --->
*** Tuple completion and aliasing ***
(embedi) Tuple's vendor string
这样产生的编译器前缀就是:arm-embedi-linux-gnueabi-
5、C compiler --->
(crosstool-NG-${CT_VERSION}-embedi) gcc ID string
以上红色字体部分即为修改之处。
五、编译工具链
配置完后,在crosstool-ng-1.8.1_build目录下执行命令:$ ct-ng build.4。
接下来,就是漫长的等待。crosstool-ng会自动下载相应的包,内核文件,然后解压,配置,编译,链接。
注意:虽然crosstool-ng自动下载相应软件包,但是速度比较慢。我们不防在执行ct-ng build命令之前,把相应的软件包预先下载好。查看crosstool-ng-1.8.1_build目录下“.config”文件就可知道需要哪些软件包及其版本,本机所需要的软件包如下:
linux-2.6.33.2.tar.bz2
binutils-2.19.1.tar.bz2
gcc-4.3.2.tar.bz2
glibc-2.9.tar.gz
dmalloc-5.5.2.tgz
duma_2_5_15.tar.gz
gdb-6.8.tar.bz2
ltrace_0.5.3.orig.tar.gz
strace-4.5.19.tar.bz2
gmp-4.3.2.tar.bz2
mpfr-2.4.2.tar.bz2
libelf-0.8.13.tar.gz
以下几个文件我没有在.config文件里发现,其实也是需要的(要么干脆你就让它自动下载吧):
ncurses-5.7.tar.gz
ecj-latest.jar
glibc-ports-2.9.tar.bz2
sstrip.c
对啦,这些下载好的软件包应该放到哪呢?放到crosstool-ng-1.8.1_build目录下的targets/tarballs文件夹中。
编译工具按链需要耐心的等待,按官网上的说法:have a coffee,have lanuth,take a sleep。我的电脑是ThinkTad SL410,双核处理器,2G内存,大约编译了近2小时。
六、增加环境变量
以上过程若没有出现错误,那恭喜你成功了,是否该打开香槟庆祝一下呢,sorry,我没有,以后一定有。呀,但别急,还需要最后一步,就是增加环境变量,输入:
$ echo "PATH=$PATH:$HOME/crosstool-ng/x-tools/arm-embedi-linux-gnueabi/bin" >> ~/.bashrc。
OK,大功造成,是否该测试一下呢,简单:
$ arm-embedi-linux-gnueabi-gcc -v
Using built-in specs.
Target: arm-embedi-linux-gnueabi
Configured with: /home/iamxzg/crosstool-ng/crosstool-ng-1.8.1_build/targets/src/gcc-4.3.2/configure --build=i686-build_pc-linux-gnu --host=i686-build_pc-linux-gnu --target=arm-embedi-linux-gnueabi --prefix=/home/iamxzg/crosstool-ng/x-tools/arm-embedi-linux-gnueabi --with-sysroot=/home/iamxzg/crosstool-ng/x-tools/arm-embedi-linux-gnueabi/arm-embedi-linux-gnueabi//sys-root --enable-languages=c,c++,fortran,java --disable-multilib --with-arch=armv4t --with-cpu=arm9tdmi --with-tune=arm920t --with-float=soft --with-pkgversion=crosstool-NG-1.8.1-embedi --disable-sjlj-exceptions --enable-__cxa_atexit --disable-libmudflap --with-gmp=/home/iamxzg/crosstool-ng/crosstool-ng-1.8.1_build/targets/arm-embedi-linux-gnueabi/build/static --with-mpfr=/home/iamxzg/crosstool-ng/crosstool-ng-1.8.1_build/targets/arm-embedi-linux-gnueabi/build/static --enable-threads=posix --enable-target-optspace --with-local-prefix=/home/iamxzg/crosstool-ng/x-tools/arm-embedi-linux-gnueabi/arm-embedi-linux-gnueabi//sys-root --disable-nls --enable-symvers=gnu --enable-c99 --enable-long-long
Thread model: posix
gcc version 4.3.2 (crosstool-NG-1.8.1-embedi)
错误与解决
1.
[ERROR] Missing: 'i686-pc-linux-gnu-gcj' or 'i686-pc-linux-gnu-gcj' or 'gcj' : either needed!
解决:sudo yum install *gcj
2.
[INFO ] Installing native gdb
[INFO ] Installing native gdb
[EXTRA] Building static target ncurses
[ERROR] make[2]: *** [tic] Error 1
[ERROR] Build failed in step 'Installing native gdb'
[ERROR] Error happened in '/opt/crosstool-ng/lib/ct-ng-1.8.1/scripts/functions' in function 'CT_DoExecLog' (line unknown, sorry)
[ERROR] called from '/opt/crosstool-ng/lib/ct-ng-1.8.1/scripts/build/debug/300-gdb.sh' at line # 162 in function 'do_debug_gdb_build'
[ERROR] called from '/opt/crosstool-ng/lib/ct-ng-1.8.1/scripts/build/debug.sh' at line # 35 in function 'do_debug'
[ERROR] called from '/opt/crosstool-ng/lib/ct-ng-1.8.1/scripts/crosstool-NG.sh' at line # 586 in function 'main'
[ERROR] Look at '/home/iamxzg/crosstool-ngg/x-tools/arm-embedi-linux-gnueabi/build.log' for more info on this error.
[ERROR] (elapsed: 73:59.36)
[73:59] / make[1]: *** [build] 错误 2
make: *** [build.4] 错误 2
解决:sudo yum install glibc-static
由于不知道要安装glibc-static,在这个问题我卡了好几天,哎,杯具。总算有个了结,因此在Fedora下,大家也应事先先安装它。
3.其它
还有一些错误,我没有及时地记录下来,如果大家遇到了,请参考以下:
用crosstool-ng建立arm-linux交叉工具链