//--------------------------------------------------------------------------------------------
// 作者:longtian635241([email protected])
// 论坛ID:idea6410
// 版权:idea6410
// 平台:友坚idea6410开发板
// 发布日期:2012-11-19
// 最后修改:2012-11-19
//http://www.urbetter.com/main.asp
//----------------------------------------------------------------------------------------------
现在之所以用crosstool-ng是因为crosstool-ng是新的用来建立交叉工具链的工具,它是crosstool的替换者。 crosstool的gcc版本只能到4.1.1,无法编译版本高于2.6.29的linux内核。而crosstool-ng一直保持着更新,现在最新 能够建立 gcc 4.4.3版本,可用来编译最新内核。
配置ubuntu编译环境
安装编译所需的包
sudo apt-get install sed bash dpkg-dev bison flex texinfo automake m4 libtool websvn tar gzip bzip2 lzma patch gcj cvs cvsd gawk -y
安装结束以后就可以用了。
如果后面出现编译错误,再增加相应的包即可
安装crosstool-ng
1 tar xvjf crosstool-ng-1.16.0.tar.bz2 2 cd crosstool-ng-1.16.0.tar.bz2 3 ./configure 4 make 5 sudo make install
注:编译的时候如果出现错误,可以利用apt-get的方式安装相应的包即可
配置自己的交叉编译器
crosstool-ng可以配置各种平台的交叉编译器,也可以构建符合自己实用条件的个性编译器。下面以ARM平台为例,制作具有一定通用性的交 叉编译器。这里我们从一个现成的编译器配置开始,用例子里的arm-unknown-linux-gnueabi作为配置的基础,然后来做一个交叉编译 器。
cp samples/arm-unknown-linux-gnueabi/crosstool.config .config
ct-ng menuconfig
Paths and misc options ---> ...... (${HOME}/src) Local tarballs directory # 指定制作编译器所需要的源码包的下载存放,可以修改成任意位置,请注意权限。现在指定到~/src下。 ...... (/opt/${CT_TARGET}) Prefix directory # 制作好的编译器所放置的目录 Target options ---> Target Architecture (arm) ---> # 注意看这项是不是ARM平台 ...... Floating point: (software) ---> # 对于很多ARM架构CPU来说是不支持硬浮点运算的,所以选择软件方式有更好的兼容性 ...... [*] Use EABI # 是否实用EABI方式,对某些指令采用异常的方式来处理(如除法指令),建议选中 Toolchain options ---> ..... (XXX) Tuple's vendor string # 这里可以修改成你自己的个性化名称,最后会生成形如arm-yourname-linux-gnueabi这样的编译器前缀
5、增加编译时的并行进程数,以增加运行效率,加快编译。
Paths and misc options --->
*** Build behavior ***
(4 ) Number of parallel jobs
这个数值不宜过大,应该为CPU数量的两倍。由于我的CPU是双核的,所以我填了4.
修改好以后就可以开始编译了。
(1) 更改shell为bash
如果运行
# ls -la /bin/sh
看到链接的是 dash ,则请运行以下命令
sudo dpkg-reconfigure dash
选择 no 以删除 dash
(2)root@xiaobin-pc:~/toolchain-build#ct-ng menuconfig
a. Paths and misc options
1)crosstool-NG behavior
默认
2)Paths
默认
3)Downloading
默认
4)Extracting
默认
5)Build behavior
(2) Number of parallel jobs
6)Logging
默认
b. Target options
Target Architecture (arm)
1)Generic target options
2)Target optimizations
3)arm other options
c. Toolchain options
1)General toolchain options
2)Tuple completion and aliasing
3)Toolchain type
4)Build system
5)Misc options
d. Operating System
Linux kernel version (2.6.32.59)
1)Common kernel options
2)linux other options
e. Binary utilities
Binuary format: (ELF)
1)GNU binutils
Binutils version (2.19.1a)
2)elf2flt
f. C compiler
C compiler (gcc)
gcc version (4.4.3)
1)Additional supported languages
2)gcc other options
3)Optimisation features
4)Settings for libraries running on target
5)Misc. obscure options
g. C-library
C library (glibc)
glibc version (2.9)
h. Debug facilities
i. Companion libraries
GMP version (4.3.2)
MPFR version (2.4.2)
PPL version (0.10.2)
CLooG/ppl version (0.15.9)
1)libelf version needed to build for target
libelf version (0.8.13)
2)Companion libraries common options
j. Companion tools
k. Test suite
下面就可以开始编译了,默认情况下,源码包会从网络下载,会占用比较大的带宽,下载后总大小在200MB左右,下载好会放到 ~/src下。
开始编译
ct-ng build
经过下载和较长的编译过程,在/opt/下生成了arm-XXX-linux-gnueabi目录
binutils-2.19.1.tar.bz2
dmalloc-5.5.2.tgz
duma_2_5_15.tar.gz
ecj-latest.jar
expat-2.0.1.tar.gz
gcc-4.3.2.tar.bz2
gdb-6.8.tar.bz2
glibc-2.9.tar.bz2
glibc-ports-2.9.tar.bz2
gmp-4.3.2.tar.bz2
libelf-0.8.13.tar.gz
linux-2.6.33.12.tar.bz2
ltrace_0.5.3.orig.tar.gz
mpfr-2.4.2.tar.bz2
ncurses-5.7.tar.gz
strace-4.5.19.tar.bz2
安装交叉编译器和测试
安装交叉编译器
刚制作好的交叉编译器其实就可以用了,但是还有些许不方便之处,我们可以进入到生成好的交叉编译器的目录
cd /opt/arm-XXX-linux-gnueabi/bin
下面执行
./arm-XXX-linux-gnueabi-gcc -v
应该可以看到如下这样的输出信息
Target: arm-XXX-linux-gnueabi Configured with: /home/XXX/crosstool-ng-1.16.0.tar.bz2/.build/src/gcc-4.3.2/configure --build=i686-build_pc-linux-gnu --host=i686-build_pc inux-gnu --target=arm-XXX-linux-gnueabi --prefix=/opt/arm-XXX-linux-gnueabi --with-sysroot=/opt/arm-XXX-linux-gnueabi- arm-XXX-linux-gnueabi/sysroot --enable-languages=c,c++,fortran,java --disable-multilib --with-float=soft --with-pkgversion=crosstool- NG-1.11.1 --disable-sjlj-exceptions --enable-__cxa_atexit --disable-libmudflap --disable-libgomp --disable-libssp --with-gmp=/home/tonghuix /crosstool-ng-1.16.0.tar.bz2/.build/arm-XXX-linux-gnueabi/build/static --with-mpfr=/home/XXX/crosstool-ng-1.11.1/.build/arm-XXX- linux-gnueabi/build/static --enable-threads=posix --enable-target-optspace --with-local-prefix=/opt/arm-XXX-linux-gnueabi- arm-XXX-linux-gnueabi/sysroot --disable-nls --enable-symvers=gnu --enable-c99 --enable-long-long Thread model: posix gcc version 4.3.2 (crosstool-NG-1.11.1)
这样就表明我们的交叉编译器,制作成功了。
下面把交叉编译器所在的目录添加到系统PATH变量中,修改~/.bashrc文件,在其中添加:
export PATH=$PATH:/opt/arm-XXX-linux-gnueabi/bin
为了使得这个PATH生效,我们可以执行一下~/.bashrc文件
source ~/.bashrc
这样我们就可以在命令行下直接使用arm-XXX-linux-gnueabi-gcc这样的命令了!
标准化安装交叉编译器
我们在使用交叉编译器的时候一般是采用arm-XXX-linux-gnueabi这样的命令的,但是很多标准Makefile需要实用标准的交叉编译器的名称,一般这个名称是arm-linux-gcc这样的。
cd /opt/arm-XXX-linux-gnueabi/bin/
那么我们在生成交叉编译器的目录下写一个link.sh脚本,新建一些软链接。
1 >link.sh 2 3 #!/bin/sh 4 PREFIX=arm-XXX-linux-gnueabi- 5 AFTFIX=arm-linux- 6 ln -s ${PREFIX}gcc ${AFTFIX}gcc 7 ln -s ${PREFIX}addr2line ${AFTFIX}addr2line 8 ln -s ${PREFIX}gdbtui ${AFTFIX}gdbtui 9 ln -s ${PREFIX}ar ${AFTFIX}ar 10 ln -s ${PREFIX}as ${AFTFIX}as 11 ln -s ${PREFIX}c++ ${AFTFIX}c++ 12 ln -s ${PREFIX}c++filt ${AFTFIX}c++filt 13 ln -s ${PREFIX}cpp ${AFTFIX}cpp 14 ln -s ${PREFIX}g++ ${AFTFIX}g++ 15 ln -s ${PREFIX}gccbug ${AFTFIX}gccbug 16 ln -s ${PREFIX}gcj ${AFTFIX}gcj 17 ln -s ${PREFIX}gcov ${AFTFIX}gcov 18 ln -s ${PREFIX}gdb ${AFTFIX}gdb 19 ln -s ${PREFIX}gfortran ${AFTFIX}gfortran 20 ln -s ${PREFIX}gprof ${AFTFIX}gprof 21 ln -s ${PREFIX}jcf-dump ${AFTFIX}jcf-dump 22 ln -s ${PREFIX}ld ${AFTFIX}ld 23 ln -s ${PREFIX}ldd ${AFTFIX}ldd 24 ln -s ${PREFIX}nm ${AFTFIX}nm 25 ln -s ${PREFIX}objcopy ${AFTFIX}objcopy 26 ln -s ${PREFIX}objdump ${AFTFIX}objdump 27 ln -s ${PREFIX}populate ${AFTFIX}populate 28 ln -s ${PREFIX}ranlib ${AFTFIX}ranlib 29 ln -s ${PREFIX}readelf ${AFTFIX}readelf 30 ln -s ${PREFIX}run ${AFTFIX}run 31 ln -s ${PREFIX}size ${AFTFIX}size 32 ln -s ${PREFIX}strings ${AFTFIX}strings 33 ln -s ${PREFIX}strip ${AFTFIX}strip
写完这个link.sh文件以后,我们可以执行一下
sh link.sh
这样我们就得到了整个使用标准名称的交叉编译工具链,可以在makefile中使用类似arm-linux-gcc这样的名称了。
更多的配置和提醒
用ct-ng menuconfig进入配置菜单,可以将某些选项修改成自己的配置,不过注意以下几个地方:
主要原因是GCC的版本过高)
1:全英文的这部分说的是你的系统中缺少相应版本的makeinfo软件。
因为gcc4.1以上的版本需要makeinfo的版本为4.2或更高。
所以输入命令行:
makeinfo --version 想查看makeinfo的版本。结果得到了以下信息:
The program 'makeinfo' is currently not installed. You can install it by typing:
sudo apt-get install texinfo
按照提示输入命令,问题得到解决。
最近在编一个针对loongson的编译链,用的是crosstool-ng提供的工具,在编译的gdb模块时,出现如下错误:
[ERROR] configure: error: expat is missing or unusable
[ERROR] make[2]: *** [configure-gdb] Error 1[ERROR] Build failed in step 'Extracting and patching toolchain components'
一开始以为是没有装expat,sudo apt-get install expat后发现该软件已经装好,到/usr/lib目录下并没有发现libexpat.so文件,到网上查了下也没有相关的信息。因为之前在编译android文件系统的机器上用crosstool-ng编译成功过一个交叉编译链,所以觉得应该是没有安装相关包,所以在本机器上直接将编译android文件系统需要的相关包安装上(详见没博客上得编译android文件系统有关文章),并sudo apt-get install libexpat-dev后再次编译,最后成功编译出需要的工具链。