使用crosstool-ng构建交叉工具链

原文1

http://hi.baidu.com/caicry/blog/item/f306db639c4281680c33fa1b.html

 

原文2

http://blog.chinaunix.net/u1/34474/showart_2198589.html

 

用crosstool-ng建立Linux交叉编译环境(以S3C2440(armv4t)为例)

    最近准备针对Linux内核和驱动做实验,但是当我用从前的制作的gcc-4.1.1编译最新的Linux内核的时候发现因为编译器太旧了无法编译,所以 决定在做一个新的可以使用的。早就知道crosstool-ng这个工具了,但是去年使用了以后发现编译出的库文件不对(我要编译armv4的,结果编译 出了v5的),所以只留下了记录,没有写文档。这次编译成功了,经过编译u-boot、Linux kernel、busybox,并制作了根文件系统做测试,都没有问题,这才决定写一份文档放到博客来。好的,闲话不多说,现在就是见证制作过程的时刻。

    首先可以去crosstool-ng的主页 了解一下这个工具,从那里我们可以知道他是根据crosstool写的。

    本文档的重点参考资料:用crosstool-ng建立arm-linux交叉工具链


一、下载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.6.1。
   使用crosstool-ng必须安装一些开发用的软件,在ubuntu下必须安装(使用apt):

libncurses5-dev
bison
flex
texinfo
automake
libtool
patch
gcj
cvs
cvsd
gawk

  根据用crosstool-ng建立arm-linux交叉工具链 的介绍,最好手动安装一下termcap


二、解压、打补丁(如果有)并建立工作目录。
   crosstool-ng和crosstool不同的地方之一就是:她并不是一下载下来就可以使用了,必须先配置安装。
   将下载下来的crosstool-ng-X.Y.Z.tar.bz2解压到你为她准备的工作目录(这里假设 为${CROSSTOOLNG}) ,并建立安装和编译目录。

mkdir crosstool- ng- 1. 6. 1_build     # 这次编译新交叉编译器的工作目录
mkdir crosstool- ng- 1. 6. 1_install   # crosstool- ng的安装目录
cd crosstool- ng- 1. 6. 1              # 进入解压后的crosstool- ng目录

patch -p1 <   <补丁文件>             # 给crosstool-ng打补丁(如果有)

. / configure - - prefix= $ { CROSSTOOLNG} / crosstool- ng- 1. 6. 1_install

                                   # 配置crosstool- ng
make                               # 编译crosstool- ng
make install                       # 安装crosstool- ng

 


三、配置本次编译的交叉编译工具链
   接下来就是配置你要编译的交叉编译工具链了,在crosstool-ng已很多已经做好的默认配置(位于crosstool-ng- X.Y.Z/samples目录下),你只要针对其进行修改就好了。对于编译器组件部分的版本最好不要修改,因为那个配搭应该是经过测试后的最高本版了, 但内核版本可以修改。

cd $ { CROSSTOOLNG} / crosstool- ng- 1. 6. 1_build/  

# 进入编译新交叉编译器的工作目录
cp . . / crosstool- ng- 1. 6. 1/ samples/ arm- unknown- linux- gnueabi /* ./

# 拷贝默认配置文件到工作目录

mv crosstool.config  .config

# 修改文件名

../crosstool-ng-1.6.1_install/bin/ct-ng menuconfig

进入 menuconfig,开始修改配置。


下面我只说说针对armv4t 需要修改的地方,别的构架等有了板子测试再说:
1、已下载好的源码包路径和交叉编译器的安装路径。
Paths and misc options  --->
  (${HOME}/development/crosstool-ng/src) Local tarballs directory   保存源码包路径
  (${HOME}/development/x-tools/${CT_TARGET}) Prefix directory  交叉编译器的安装路径
这两个请依据你的实际情况来修改。

2、修改交叉编译器针对的构架
 Target options  --->
           *** Target optimisations ***
           (armv4t ) Architecture level
           (arm9tdmi ) Emit assembly for CPU   
           (arm920t ) Tune for CPU

以上这几个参数是如何得出的可以参考gcc的man手册,你可以在你下载的gcc-4.3.2.tar.bz2解压后找到,她的位置是gcc-4.3.2/gcc/doc/gcc.1。打开方式:

man . / gcc. 1


你可以在其中找到:

. . . . . .
 ARM Options
. . . . . .
- mcpu= name   (
Emit assembly for CPU )
           This specifies the name of the target ARM processor. GCC uses this
           name to determine what kind of instructions it can emit when gener‐
           ating assembly code. Permissible names are: arm2, arm250, arm3,
           arm6, arm60, arm600, arm610, arm620, arm7, arm7m, arm7d, arm7dm,
           arm7di, arm7dmi, arm70, arm700, arm700i, arm710, arm710c, arm7100,
           arm7500, arm7500fe, arm7tdmi, arm7tdmi- s, arm8, strongarm, stron‐
           garm110, strongarm1100, arm8, arm810, arm9, arm9e, arm920, arm920t,
           arm922t, arm946e- s, arm966e- s, arm968e- s, arm926ej- s, arm940t,
           arm9tdmi , arm10tdmi, arm1020t, arm1026ej- s, arm10e, arm1020e,
           arm1022e, arm1136j- s, arm1136jf- s, mpcore, mpcorenovfp,
           arm1156t2- s, arm1176jz- s, arm1176jzf- s, cortex- a8, cortex- r4, cor‐
           tex- m3, xscale, iwmmxt, ep9312.

       - mtune= name  
(Tune for CPU)
           This option is very similar to the -mcpu= option , except that
           instead of specifying the actual target processor type, and hence
           restricting which instructions can be used, it specifies that GCC
           should tune the performance of the code as if the target were of
           the type specified in this option, but still choosing the instruc‐
           tions that it will generate based on the cpu specified by a - mcpu=
           option. For some ARM implementations better performance can be
           obtained by using this option.

       - march= name 
(Architecture level)
           This specifies the name of the target ARM architecture. GCC uses
           this name to determine what kind of instructions it can emit when
           generating assembly code. This option can be used in conjunction
           with or instead of the - mcpu= option. Permissible names are:
           armv2, armv2a, armv3, armv3m, armv4, armv4t , armv5, armv5t,
           armv5te, armv6, armv6j, armv6t2, armv6z, armv6zk, armv7, armv7- a,
           armv7- r, armv7- m, iwmmxt, ep9312.

......



3、关闭JAVA编译器,避免错误。
  我这里用ubuntu 9.10编译JAVA编译器的时候会出错,也许是host的gcj的问题,反正我不用JAVA,所以就直接关闭了。如果有兄弟知道如何修正记得通知一声!!
C compiler  --->
      *** Additional supported languages: ***
      [N ] Java 

error log:

[INFO ]  =================================================================
[INFO ]  Installing final compiler
[EXTRA]    Configuring final compiler
[EXTRA]    Building final compiler
[ERROR]    jar: internal error:
[ERROR]    make[4]: *** [libgcj-4.3.2.jar] Error 1
[ERROR]    make[3]: *** [all-recursive] Error 1
[ERROR]    make[2]: *** [all-target-libjava] Error 2
[ERROR]    make[1]: *** [all] Error 2
[ERROR]    Build failed in step 'Installing final compiler'
[ERROR]    Error happened in '/home/tekkaman/development/research/crosstool-ng/crosstool-ng-1.6.1_install/lib/ct-ng-1.6.1/scripts/functions' in function 'CT_DoExecLog' (line unknown, sorry)
[ERROR]          called from '/home/tekkaman/development/research/crosstool-ng/crosstool-ng-1.6.1_install/lib/ct-ng-1.6.1/scripts/build/cc/gcc.sh' at line # 350 in function 'do_cc'
[ERROR]          called from '/home/tekkaman/development/research/crosstool-ng/crosstool-ng-1.6.1_install/lib/ct-ng-1.6.1/scripts/crosstool-NG.sh' at line # 562 in function 'main'
[ERROR]    Look at '/home/tekkaman/development/x-tools/arm-tekkaman-linux-gnueabi/build.log' for more info on this error.
[ERROR]  (elapsed: 67:10.67)
[67:11] / make: *** [build] 错误 2

               
4、根据参考资料,禁止内核头文件检测(只起到节约时间的作用(不到1S的时间),不推荐禁用)
Operating System  --->

 [N ]     Check installed headers

5、增加编译时的并行进程数,以增加运行效率,加快编译。
Paths and misc options  --->
   *** Build behavior ***
   (4 ) Number of parallel jobs
   这个数值不宜过大,应该为CPU数量的两倍。由于我的CPU是双核的,所以我填了4.

6、一些个性化的修改(可以不修改)
Toolchain options  --->
       *** Tuple completion and aliasing *** 
       (tekkaman) Tuple's vendor string
这样产生的编译器前缀就是:arm-tekkaman-linux-gnueabi-

C compiler  --->
       (crosstool-NG-${CT_VERSION}-tekkaman) gcc ID string

配置好以后保存。

最后,内核源码的版本号修改 ,请直接修改crosstool- ng- 1. 6. 1_build目录下的.config文件,不止一处,有关的都要修改。
有:

CT_KERNEL_VERSION=
CT_KERNEL_V_2_6_??_?=y
CT_LIBC_GLIBC_MIN_KERNEL=

如果再次 ../crosstool-ng-1.6.1_install/bin/ct-ng menuconfig,这个修改又会复原,必须再次手工修改。
你也可以选择修改crosstool-ng-X.Y.Z_build/config/kernel/linux.in等文件,只是比较麻烦,但这可以彻底解决,实现在界面中增加内核版本。


四、为加快速度,根据配置自行下载相应的软件包。 (选做)
   虽然crosstool-ng发现找不到软件包的时候会自动下载,但是比较慢。根据这次的配置情况(查看“.config”文件) ,我预先下载了以下的软件包:
binutils-2.19.1.tar.bz2
glibc-2.9.tar.gz          
dmalloc-5.5.2.tgz        
glibc-ports-2.9.tar.bz2   
mpfr-2.4.2.tar.bz2
duma_2_5_15.tar.gz       
gmp-4.3.1.tar.bz2         
ncurses-5.7.tar.gz
ecj-latest.jar       
libelf-0.8.12.tar.gz      
sstrip.c
gcc-4.3.2.tar.bz2        
linux-2.6.33.1.tar.bz2   
strace-4.5.19.tar.bz2
gdb-6.8.tar.bz2         
ltrace_0.5.3.orig.tar.gz

下载完之后,记得将这些软件包放在配置时指定的文件夹。


五、开始编译。

. . / crosstool- ng- 1. 6. 1_install/bin/ct- ng bluid


我的笔记本用了大概40多分钟编译完成。


六、编译好后的交叉编译器。
编译器位于:${你配置时确定的路径}/x-tools/arm-tekkaman-linux-gnueabi/bin
库文件位于:${你配置时确定的路径}/x-tools/arm-tekkaman-linux-gnueabi/arm-tekkaman-linux-gnueabi/lib

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Ubuntu是一种基于Linux的操作系统,而crosstool-ng是一个工具生成工具。这个工具允许用户在Ubuntu操作系统上生成交叉编译工具,从而能够在一个平台上为不同的目标体系结构编译和构建软件。 使用crosstool-ng可以为各种不同的目标体系结构生成交叉编译工具,包括ARM、MIPS、PowerPC等。生成的工具包含了一个交叉编译器、库和头文件,可以用来编译和构建适用于特定目标体系结构的应用程序。 Ubuntu的用户可以通过安装crosstool-ng并按照相应的文档和指南进行设置和配置。首先,用户需要在Ubuntu上安装和配置必要的开发工具和依赖项,然后从crosstool-ng的官方网站下载最新的源代码并进行编译和安装。 安装完成后,用户需要使用crosstool-ng提供的配置文件进行配置和设置。用户可以选择合适的目标体系结构,并选择所需的版本和选项。之后,用户可以运行crosstool-ng来生成交叉编译工具。 一旦工具生成完成,用户就可以使用它来编译和构建适用于特定目标体系结构的应用程序。用户可以在Ubuntu上开发应用程序,并将其交叉编译为可在其他平台上运行的可执行文件。 总之,Ubuntu和crosstool-ng的结合为用户提供了一个方便而强大的工具,使他们能够在Ubuntu上生成适用于不同目标体系结构的交叉编译工具,并开发多平台的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值