原文1
http://hi.baidu.com/caicry/blog/item/f306db639c4281680c33fa1b.html
原文2
http://blog.chinaunix.net/u1/34474/showart_2198589.html
最近准备针对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}) ,并建立安装和编译目录。
|
三、配置本次编译的交叉编译工具链
接下来就是配置你要编译的交叉编译工具链了,在crosstool-ng已很多已经做好的默认配置(位于crosstool-ng- X.Y.Z/samples目录下),你只要针对其进行修改就好了。对于编译器组件部分的版本最好不要修改,因为那个配搭应该是经过测试后的最高本版了, 但内核版本可以修改。
|
下面我只说说针对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。打开方式:
|
你可以在其中找到:
|
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= |
如果再次
../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
下载完之后,记得将这些软件包放在配置时指定的文件夹。
五、开始编译。
|
我的笔记本用了大概40多分钟编译完成。
六、编译好后的交叉编译器。
编译器位于:${你配置时确定的路径}/x-tools/arm-tekkaman-linux-gnueabi/bin
库文件位于:${你配置时确定的路径}/x-tools/arm-tekkaman-linux-gnueabi/arm-tekkaman-linux-gnueabi/lib