深海的小鱼儿

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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交叉工具链

posted on 2012-04-01 14:05  深海的小鱼儿  阅读(2755)  评论(0编辑  收藏  举报