最近在做davinci平台的系统开发,用的是ti公司的dm6446芯片,这款芯片比较经典所以资料也挺多的,而且ti官方给提供一个dvsdk的软件包,里面包含了包括bootloader、kernel、fs、DSP算法及各种编解码codec,可谓给开发者提供了很多便利。当然里面也包含了arm-linux的交叉编译工具链,但是版本比较旧了,是基于gcc-4.2.0版本的,现在最新的gcc的版本已经到了4.5.1。所以打算更新一下交叉编译工具链的版本,今天要做的这个交叉编译工具链是基于gcc-4.4.3版本的。
制作的过程中主要借鉴了http://blog.chinaunix.net/u1/34474/showart_2198589.html和http://blog.chinaunix.net/u3/104206/showart_2325147.html方法。
一、下载crosstool-ng,并为使用安装必要的软件。
刚开始选者的工具是crosstool,但是后来发现它支持的gcc的版本太低了,所以就选择了crosstool-ng工具。
crosstool-ng的下载地址是:http://ymorin.is-a-geek.org/download/crosstool-ng/
然后到这里http://ymorin.is-a-geek.org/download/crosstool-ng/01-fixes/看看有没有相应的补丁,有得话一起下载下来。
我使用的是crosstool-ng-1.9.0版本。用的是ubuntu9.04的平台。
使用crosstool-ng必须依赖一些开发用的软件包:libncurses5-dev、bison、flex、texinfo、automake、libtool、patch、gcj、cvs、cvsd、gawk。
用指令:sudo apt-get install xxx进行下载安装
最后根据用crosstool-ng建立arm-linux交叉工具链的介绍,最好手动安装一下termcap。
二、解压、打补丁(如果有)并建立工作目录。
crosstool-ng和crosstool不同的地方之一就是:她并不是一下载下来就可以使用了,必须先配置安装。
将下载下来的crosstool-ng-X.Y.Z.tar.bz2解压到你为她准备的工作目录(这里假设为${CROSSTOOLNG}),并建立安装和编译目录
三、安装crosstool-ng
$ mkdir ~/croosstool-ng # 在当前用户目录下建立croosstool-ng目录
$ cd ~/croosstool-ng
$ mv /tmp/crosstool-ng-1.9.0.tar.bz2 ./ # 把下载的crosstool-ng软件包放到 crosstool-ng目录中
$ tar -jxvf crosstool-ng-1.9.0.tar.bz2 # 解包
$ cd crosstool-ng-1.9.0 # 进入解压目录
$ 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 出现帮助信息表明安装成功了
四、配置交叉编译工具链
$ 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-davinci-linux-gnueabi/crosstool.config .config#拷贝davinci平台的默认配置选项
PS:为加快速度,根据配置自行下载相应的软件包。(选做)
虽然crosstool-ng发现找不到软件包的时候会自动下载,但是比较慢。根据这次的配置情况(查看“.config”文件),我预先下载了以下的软件包:
binutils-2.20.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.2.tar.bz2
ncurses-5.7.tar.gz
ecj-latest.jar
libelf-0.8.13.tar.gz
sstrip.c
gcc-4.4.3.tar.bz2
linux-2.6.33.7.tar.bz2
strace-4.5.19.tar.bz2
gdb-6.8.tar.bz2
ltrace_0.5.3.orig.tar.gz
下载完之后,记得将这些软件包放在配置时指定的文件夹(src/下)
以上工作都完成以后,咱们就要开始真正的配置工作了。
首先用终端进入到crosstool-ng-1.8.1_build/目录下。
然后执行$ ct-ng menuconfig, 此时会出现crosstool-ng的配置窗口。
1、已下载好的源码包路径和交叉编译器的安装路径。
Paths and misc options --->
(${HOME}/crosstool-ng/src) Local tarballs directory保存源码包路径
(${HOME}/crosstool-ng/x-tools/${CT_TARGET}) Prefix directory交叉编译器的安装路径
以上根据自己的路径自行修改
2、修改交叉编译器针对的构架
Target options --->
由于咱们是copy的默认的davinci的配置文件,所以这项不用修改
3、增加编译时的并行进程数,以增加运行效率,加快编译。
Paths and misc options --->
*** Build behavior ***
(4) Number of parallel jobs
这个数值不宜过大,应该为CPU数量的两倍。由于我的CPU是双核的,所以我填了4
4、选择gcc版本号
C compiler --->
gcc version (xxx)---> //选择咱们需要编译的gcc 4.4.3
5、其他工具包版本选择
Operating System --->
Linux kernel version---> 内核版本
Binary utilities --->
binutils version---> binutils包
C-library--->
glibc version ---> c库
Companion libraries--->
GMP、MPFR、PPL、CLooG/ppl等版本的选择
6、修改操作系统选项,禁止内核头文件检测
Operating System --->
[ ] Check installed headers
另:在选择CLooG/ppl版本时,我刚开始选择的是CLooG/ppl 0.15.10,但是出现了一下错误
[ERROR] Build failed in step 'Installing CLooG/ppl'
[ERROR] Error happened in '/opt/crosstool-ng/lib/ct-ng-1.9.0/scripts/functions' in function 'CT_DoExecLog' (line unknown, sorry)
解决方法:选择CLooG/ppl 0.15.9就可以了。
五、编译工具链
配置完后,在crosstool-ng-1.8.1_build目录下执行命令:$ ct-ng build.4。 我的比较慢用了4个小时,但是别人都用了40分钟,dont know why?
编译好的工具链在x-tools/arm-davinci-linux-gnueabi/bin目录下面,添加到环境变量中就可以使用了。
最后测试一下工具链版本:
#arm-davinci-linux-gnueabi-gcc -v
#Using built-in specs.
Target: arm-davinci-linux-gnueabi
Configured with: /home/chenbolin/crosstool-ng/crosstool-ng-1.9.0_build/targets/src/gcc-4.4.3/configure --build=i686-build_pc-linux-gnu --host=i686-build_pc-linux-gnu --target=arm-davinci-linux-gnueabi --prefix=/home/chenbolin/crosstool-ng/x-tools/arm-davinci-linux-gnueabi --with-sysroot=/home/chenbolin/crosstool-ng/x-tools/arm-davinci-linux-gnueabi/arm-davinci-linux-gnueabi//sys-root --enable-languages=c,c++ --disable-multilib --with-arch=armv5te --with-cpu=arm926ej-s --with-tune=arm926ej-s --with-float=soft --with-pkgversion=crosstool-NG-1.9.0 --enable-__cxa_atexit --disable-libmudflap --disable-libgomp --disable-libssp --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with-gmp=/home/chenbolin/crosstool-ng/crosstool-ng-1.9.0_build/targets/arm-davinci-linux-gnueabi/build/static --with-mpfr=/home/chenbolin/crosstool-ng/crosstool-ng-1.9.0_build/targets/arm-davinci-linux-gnueabi/build/static --with-ppl=/home/chenbolin/crosstool-ng/crosstool-ng-1.9.0_build/targets/arm-davinci-linux-gnueabi/build/static --with-cloog=/home/chenbolin/crosstool-ng/crosstool-ng-1.9.0_build/targets/arm-davinci-linux-gnueabi/build/static --enable-threads=posix --enable-target-optspace --with-local-prefix=/home/chenbolin/crosstool-ng/x-tools/arm-davinci-linux-gnueabi/arm-davinci-linux-gnueabi//sys-root --disable-nls --enable-symvers=gnu --enable-c99 --enable-long-long
Thread model: posix
gcc version 4.4.3 (crosstool-NG-1.9.0)
错误及解决办法请参考:
转载请注明文章来源:http://hi.baidu.com/caicry
crosstool-ng是新的用来建立交叉工具链的工具,它是crosstool的替换者.
使用crosstool最多只能编译gcc 4.1.1 glibc 2.x的版本.
而crosstool-ng一直保持着更新,现在最新能够建立 gcc 4.3.2版本 glibc 2.9版本...
在使用低于4.1.1的版本编译2.6.29 kernel时,会出现
include/linux/compiler-gcc4.h:7:3: error: #error Your version of gcc miscompiles the __weak directive
include/linux/compiler-gcc4.h:7 :如下
/* GCC 4.1.[01] miscompiles __weak */
#if __GNUC_MINOR__ == 1 && __GNUC_PATCHLEVEL__ <= 1
# error Your version of gcc miscompiles the __weak directive
#endif
所以使用crosstool-ng建立一个新的工具链(gcc 4.3.2 glibc 2.9),以支持对最新kernel编绎.
测试环境:
Debian Linux 2.6.18-6-686
Ubuntu Linux 2.6.28-14 (Ubuntu 9.0.4)
1.crosstool-ng的安装
cd /tmp
mkdir crosstool-ng
wget http://ymorin.is-a-geek.org/download/crosstool-ng/crosstool-ng-1.5.2.tar.bz2
tar jxvf crosstool-ng-1.5.2.tar.bz2
cd /tmp/crosstool-ng-1.5.2
./configure --prefix=/opt/crosstool-ng
make
make install
echo "PATH=$PATH:/opt/crosstool-ng/bin" >> ~/.bashrc
source ~/.bashrc
ct-ng help
## ^ ^ 安装成功
2.安装必要工具包
#安装java开发包
sudo apt-get install gcj
#安装cvs
sudo apt-get install cvs
#切换mawk
sudo apt-get install gawk
cd /usr/bin
sudo mv mawk mawk.bak
sudo ln -s gawk mawk
Ubuntu 9.0.4 请先安装下 termcap库 参考本文 错误与解决 4.. .
3.crosstool-ng使用范例
本范例记录了使用crosstool-ng编绎arm-unknown-linux-gnueabi工具链的过程
cd /tmp/crosstool-ng
mkdir build_toolchain
mkdir ~/src
生成默认配置文件:
ct-ng arm-unknown-linux-gnueabi
也可以这样子:
cp /opt/crosstool-ng/lib/ct-ng-1.5.2/samples/arm-unknown-linux-gnueabi/crosstool.config .config
ct-ng menuconfig
根据实际情况修改这些配置(我测试的是一款arm7 SOC,其指令集为armv4t)
指定指令集
Target options --->
Architecture level
填入 armv4t
修改工具链安装路径
Paths and misc options --->
Prefix directory()
填入/opt/arm/4.3.2/${CT_TARGET}
修改操作系统选项,禁止内核头文件检测
Operating System --->
[ ] Check installed headers
退出保存配置文件,手动修改内核头文件的安装版本,以修正段错误:
vim .config
修改kernel的安装版本
CT_KERNEL_VERSION="2.6.18"
修改libc中配置的内核头文件的安装版本至2.6.18
CT_LIBC_GLIBC_MIN_KERNEL="2.6.18"
保存退出(注意若使用ct-ng menuconfig进行配置,上面的手动修改信息会丢失,需再次从头配置)
PS:如果你编绎还是失败了或者测试失败了,那可以参考一下,我测试通过的配置文件:crosstool-ng for arm720t配置文件
-----------我是分隔线 2010快乐 -----------------------------------
libc库已经换用git来管理源码(sources.redhat.com),下面两个包
glibc-cvs-2.9.tar.gz
glibc-ports-cvs-2.9.tar.gz
将无法从cvs中取出,临时可以这样子解决:
cd /tmp/
wget ftp://sourceware.org/pub/glibc/releases/glibc-2.9.tar.bz2
tar jxvf glibc-2.9.tar.bz2
mv glibc-2.9 glibc-cvs-2.9
tar zcvf glibc-cvs-2.9.tar.gz glibc-cvs-2.9
wget ftp://sourceware.org/pub/glibc/releases/glibc-ports-2.9.tar.bz2
tar jxvf glibc-ports-2.9.tar.bz2
mv glibc-ports-2.9 glibc-ports-cvs-2.9
tar zcvf glibc-ports-cvs-2.9.tar.gz glibc-ports-cvs-2.9
复制这两个*.gz包至 crosstool-ng设置的包下载路径(本例中设置的是:~/src)
--------------------------------------------------------------------------------------
开始编绎(在我的机子上耗时一小时)
ct-ng build.4(用太多线程,很耗系统资源)
4.为工具链增加新链接
cd /opt/arm/4.3.2/arm-unknown-linux-gnueabi/bin
./autoln.sh
autoln.sh是一个脚本,用来自动链接arm-unknown-linux-gnueabi的工具...
文件名:autoln.sh 拷到要自动建立链接的文件夹使用。
#!/bin/bash
#
# main
#
if [ $# -lt 1 ] ; then
echo "default path: ./"
BIN_PATH=./
else
BIN_PATH=$1
fi
if [ ! -d $1 ] ; then
echo "path error"
exit
fi
cd $BIN_PATH
SRC=`ls | awk '{print $1}'`
for i in $SRC ; do
if [ "$i" != "autoln.sh" ] ; then
#echo $i
TARGET=`echo $i | sed 's/arm-unknown-linux-gnueabi/arm-linux/g' `
echo $TARGET
ln -s $i $TARGET
fi
done
错误与解决
1.[ERROR] Missing: 'i486-linux-gnu-gcj' or 'i486-linux-gnu-gcj' or 'gcj' : either needed!
解决:sudo apt-get install gcj
2.
[ERROR] Build failed in step 'Retrieving needed toolchain components' tarballs'
[ERROR] Error happened in '/opt/crosstool-ng/lib/ct-ng-1.4.1/scripts/functions' in function 'CT_DoExecLog' (line unknown, sorry)
[ERROR] called from '/opt/crosstool-ng/lib/ct-ng-1.4.1/scripts/functions' at line # 471 in function 'CT_GetCVS'
[ERROR] called from '/opt/crosstool-ng/lib/ct-ng-1.4.1/scripts/build/libc/glibc.sh' at line # 31 in function 'do_libc_get'
[ERROR] called from '/opt/crosstool-ng/lib/ct-ng-1.4.1/scripts/crosstool-NG.sh' at line # 449 in function 'main'
[ERROR] Look at '/home/star/x-tools/arm-unknown-linux-gnueabi/build.log' for more info on this error.
[ERROR] (elapsed: 33:29.56)
[33:30] / make[1]: *** [build] 错误 127
make: *** [build.4] 错误 2
解决: sudo apt-get install cvs
3.
[INFO ] Installing C library headers
[EXTRA] Configuring C library
[EXTRA] Installing C library headers
[ERROR] make[3]: *** [/home/star/x-tools/arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi//sys-root/usr/include/gnu/lib-names.h] Error 1
[ERROR] make[2]: *** [install-headers] Error 2
[ERROR] Build failed in step 'Installing C library headers'
[ERROR] Error happened in '/opt/crosstool-ng/lib/ct-ng-1.4.1/scripts/functions' in function 'CT_DoExecLog' (line unknown, sorry)
[ERROR] called from '/opt/crosstool-ng/lib/ct-ng-1.4.1/scripts/build/libc/glibc.sh' at line # 185 in function 'do_libc_headers'
[ERROR] called from '/opt/crosstool-ng/lib/ct-ng-1.4.1/scripts/crosstool-NG.sh' at line # 494 in function 'main'
[ERROR] Look at '/home/star/x-tools/arm-unknown-linux-gnueabi/build.log' for more info on this error.
[ERROR] (elapsed: 36:41.91)
[36:42] / make[1]: *** [build] 错误 2
make: *** [build.4] 错误 2
解决:查看build.log
[ALL ] /usr/bin/install: cannot stat `/tmp/crosstool-ng/targets/arm-unknown-linux-gnueabi/build/build-libc-headers/gnu/li
b-names.h': No such file or directory
但在这之前也发生了一个error,但crosstool-ng并没有报错
[ALL ] mawk: scripts/gen-sorted.awk: line 19: regular expression compile failed (bad class -- [], [^] or [)
[ALL ] /[^
[ALL ] mawk: scripts/gen-sorted.awk: line 19: syntax error at or near ]
[ALL ] mawk: scripts/gen-sorted.awk: line 19: runaway regular expression /, "", subd ...
OK,在gen-sorted.awk第19行,出错,这是一个简单的错误,缺少了转义符
查找一个看有没有类似的
cd /tmp/crosstool-ng/targets/src/glibc-cvs-2.9/scripts
sed '/\^\//p' gen-sorted.awk -n
输出的则是存在语法错误的语句
可以直接用
sed -i 's/\^\//\^\\\//g' gen-sorted.awk
这种方法是不完善的,后面的还是会出现错误。
网上搜了下,需要用/usr/bin/gawk 替换/usr/bin/mawk,即
sudo apt-get install gawk
cd /usr/bin
sudo mv mawk mawk.bak
sudo ln -s gawk mawk
4.
[INFO ] =================================================================
[INFO ] Installing C library
[EXTRA] Configuring C library
[WARN ] Removing "-pipe" for use with glibc>=2.6
[EXTRA] Building C library
[ERROR] make[4]: *** [/tmp/crosstool-ng/targets/arm-unknown-linux-gnueabi/build/build-libc/elf/ld.so] Error 2
[ERROR] make[3]: *** [elf/subdir_lib] Error 2
[ERROR] make[2]: *** [all] Error 2
[ERROR] Build failed in step 'Installing C library'
[ERROR] Error happened in '/opt/crosstool-ng/lib/ct-ng-1.4.1/scripts/functions' in function 'CT_DoExecLog' (line unknown, sorry)
[ERROR] called from '/opt/crosstool-ng/lib/ct-ng-1.4.1/scripts/build/libc/glibc.sh' at line # 504 in function 'do_libc'
[ERROR] called from '/opt/crosstool-ng/lib/ct-ng-1.4.1/scripts/crosstool-NG.sh' at line # 494 in function 'main'
[ERROR] Look at '/home/star/x-tools/arm-unknown-linux-gnueabi/build.log' for more info on this error.
[ERROR] (elapsed: 32:05.76)
[32:06] / make[1]: *** [build] 错误 2
make: *** [build.4] 错误 2
解决:
sudo apt-get install gawk
cd /usr/bin
sudo mv mawk mawk.bak
sudo ln -s gawk mawk
5.
49567 [ERROR] configure: error: no termcap library found
49568 [ERROR] make[3]: *** [configure-gdb] Error 1
49569 [ALL ] make[3]: Leaving directory `/opt/build_toolchain/targets/arm-unknown-linux-gnueabi/build/build-gdb-cross'
49570 [ERROR] make[2]: *** [all] Error 2
49571 [ALL ] make[2]: Leaving directory `/opt/build_toolchain/targets/arm-unknown-linux-gnueabi/build/build-gdb-cross'
49572 [ERROR] Build failed in step 'Installing cross-gdb'
49573 [ERROR] Error happened in '/usr/lib/ct-ng-1.4.1/scripts/functions' in function 'CT_DoExecLog' (line unknown, sorry)
49574 [ERROR] called from '/usr/lib/ct-ng-1.4.1/scripts/build/debug/300-gdb.sh' at line # 126 in function 'do_debug _gdb_build'
49575 [ERROR] called from '/usr/lib/ct-ng-1.4.1/scripts/build/debug.sh' at line # 35 in function 'do_debug'
49576 [ERROR] called from '/usr/lib/ct-ng-1.4.1/scripts/crosstool-NG.sh' at line # 494 in function 'main'
49577 [ERROR] Look at '/opt/arm/4.3.2/arm-unknown-linux-gnueabi/build.log' for more info on this error.
49578 [ERROR] (elapsed: 72:30.97)
解决:
这个问题我只在ubuntu 9.0.4中遇到过...缺少了termcap 库,但我在源里又没有搜到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
(又需要从头编译工具链了 …… )
参考资料
1.crosstool-ng WIKI
http://ymorin.is-a-geek.org/dokuwiki/projects/crosstool