Chinaunix首页 | 论坛 | 博客
  • 博客访问: 844562
  • 博文数量: 489
  • 博客积分: 475
  • 博客等级: 下士
  • 技术积分: 3087
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-08 16:28
文章分类

全部博文(489)

文章存档

2013年(7)

2012年(301)

2011年(181)

分类:

2012-01-08 22:36:02

    花了几天时间才把基于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的下载地址是:
值得注意的是,下载里最新的crosstool-ng以后,记得在到 看看有没有相应的补丁,有得话一起下载下来。


本次下载的版本是 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。
    然后还要手动安装一下。
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
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”文件就可知道需要哪些软件包及其版本,本机所需要的软件包如下














以下几个文件我没有在.config文件里发现,其实也是需要的(要么干脆你就让它自动下载吧):
ncurses-5.7.tar.gz


    对啦,这些下载好的软件包应该放到哪呢?放到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交叉工具链



阅读(641) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~