转载自: http://hi.baidu.com/shishlv/blog/item/8699d426e3aedd1a8a82a1f5.html
用crosstool-ng建立Linux交叉编译环境(以S3C2440(armv4t)为例)
最近准备针对支持ARMv4指令的可执行文件进行反汇编,但是当我安装arm-linux-gcc并用其进行编译一个简单的c程序时,却只能得到支持 ARMv1指令的可执行文件,我需要的是ARMv4。查了很多资料,知道crosstool-ng这个工具了,于是上网收集了不少相关资料,但是很多不是 很满意的,最后很感谢同事--小高,是他帮我找到了一篇比较满意的文章,很感谢他。我现在正在进行很复习的crosstool-ng安装过程,不知道对我 的工作有没有帮助。但闲话不多说,现在就开始见证我的制作过程。
首先可以去crosstool-ng的主页了解一下这个工具,从那里我们可以知道他是根据crosstool写的。
本文档的重点参考资料:用crosstool-ng建立arm-linux交叉工具链
crosstool-ng的下载地址是: http://ymorin.is-a-geek.org/download/crosstool-ng/
值得注意的是,下载里最新的crosstool-ng以后,记得在到 http://ymorin.is-a-geek.org/download/crosstool-ng/01-fixes/看看有没有相应的补丁,有得话一起下载下来。
我使用的是 crosstool-ng-1.6.2。
使用crosstool-ng必须安装一些开发用的软件,在ubuntu下必须安装(使用sudo apt-get ):
libncurses5-dev bison flex texinfo automake libtool patch gcj cvs cvsd gawk |
这个问题只在ubuntu 9.0.4中遇到...缺少了termcap 库,下载安装(termcap这东西的确很古老)
cd /tmp
wget ftp://ftp.gnu.org/gnu/termcap/termcap-1.3.1.tar.gz
tar zxvf termcap-1.3.1.tar.gz
cd termcap-1.3.1
./configure --prefix=/usr
make
make install
crosstool-ng和crosstool不同的地方之一就是:她并不是一下载下来就可以使用了,必须先配置安装。
cd /tmp
mkdir crosstool-ng
tar jxvf crosstool-ng-1.6.2.tar.bz2
cd /tmp/crosstool-ng-1.6.2
./configure --prefix=/opt/crosstool-ng
make
make install
echo "PATH=$PATH:/opt/crosstool-ng/bin" >> ~/.bashrc
source ~/.bashrc
ct-ng help
## ^ ^ 安装成功
|
三、配置本次编译的交叉编译工具链
接下来就是配置你要编译的交叉编译工具链了,在crosstool-ng已很多已经做好的默认配置(位于crosstool-ng- X.Y.Z/samples目录下),你只要针对其进行修改就好了。对于编译器组件部分的版本最好不要修改,因为那个配搭应该是经过测试后的最高本版了, 但内核版本可以修改。
cd ${CROSSTOOLNG}/crosstool-ng-1.6.1_build/ #进入编译新交叉编译器的工作目录 #拷贝默认配置文件到工作目录 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 |
你可以在其中找到:
...... ...... |
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 --->
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-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