如果要基于gcc和glibc来制作工具链,可以使用crosstool来进行编译;如果要基于gcc和uClibc来制作工具链,可以使用buildroot来进行编译。若不借助这些工具,编译过程是非常麻烦的。uClibc比glibc小,在已有的接口上是兼容的,更适合于嵌入式系统。但是uClibc并没有包括glibc中所有的接口实现,因此有些应用可能在uClibc中不能编译。基于这个原因,我们使用glibc,当对系统很熟悉后,或是在开发资源很受限的产品时,可以使用uClibc。
可以先自己下载源码,再运行crosstool。官方网站为,也可以参考其中的crosstool-how to.html选择、配置、编译工具链。
我们有现成的文件,在/work/tools/create_crosstools目录下的crosstool-0.43.tar.gz工具来编译工具链,它运行时,会自动从网上下载源码,然后编译。
一、修改crosstool脚本
执行以下命令解压缩:
$ tar xzf crosstool-0.43.tar.gz
glibc-2.3.6-version-info.h_err.patch是个补丁文件,它修改glibc-2.3.6/csu/Makefile里面的一个小错误,导致自动生成的version-info.h文件编译出错。将其复制到crosstool的补丁目录下:
$ cp glibc-2.3.6-version-info.h_err.patch crosstool-0.43/patches/glibc-2.3.6/
需要修改crosstool-0.43目录下的demo-arm-softfloat.sh、arm-softfloat.dat、all.sh这三个文件。
1.修改demo-arm-softfloat.sh,修改后的内容如下:
07 TARBALLS_DIR=/work/tools/create_crosstools/src_gcc_glibc (源码存放的位置)
08 RESULT_TOP=/work/tools (编译结果存放的位置)
2.修改arm-softfloat.dat,修改如下:
02 TARGET=arm-softfloat-linux-gnu
改为:
02 TARGET=arm-linux
它表示编译出来的工具样式为arm-linux-gcc、arm-linux-ld等,这是常用的名字。
3.修改all.sh。
如果现在就执行demo-arm-softfloat.sh,最终结果将存放在/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux目录下。为简洁起见,修改all.sh,将结果存放在/work/tools/gcc-3.4.5-glibc-2.3.6目录下。
70 PREFIX=${PREFIX-$RESULT_TOP/$TOOLCOMBO/$TARGET}
改为:
70 PREFIX=${PREFIX-$RESULT_TOP/$TOOLCOMBO}
二、编译、安装工具链
执行以下命令:
$ cd crosstool-0.43/
$ ./demo-arm-softfloat.sh
注意:如果看到‘Don'\''t run all.sh or crosstool.sh as root, it'\''s dangerous’,就切换用户,以其他非 root 用户重新登陆,若遇到提示 权限不够 或是 无法进入目录时,su 一下就可以了。
编译两三个小时后(我的只用了不到2小时),将在/work/tools/目录下生成gcc-3.4.5-glibc-2.3.6子目录,交叉编译器、库、头文件都包含在里面。
设置PATH环境变量:
$ export PATH=$PATH:/work/tools/gcc-3.4.5-glibc-2.3.6/bin
这使得可以直接运行这个目录下的程序,而不需要制定目录位置。
为了不要每次使用时都手工设置PATH,可以在/etc/environment中修改PATH的值:
$ vim environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/work/tools/gcc-3.4.5-glibc-2.3.6/bin"
最后可以测试一下:
$ arm-linux-gcc -v