所谓交叉编译环境,就是在普通的 PC 机编译生成能在目标机(如 ARM )上运行的软件。在 GNU 对工具链的定义中,整个交叉编译工具链 应该是 GCC + binutils + glibc 。其中 GCC 又包括了预编译器 cpp 、 C 编译器 gcc 、汇编器 as 和链接器 ld 。
交叉编译工具链的获得方式:
( 1 )从网上下载已经构建好的交叉编译工具链,比如 ARM 的交叉编译工具链可以从 ftp://ftp.arm.linux.org.uk/pub/linux/arm/toochain/ 下载。注意这些已经做好了的交叉编译工具链往往规定了安装的路径(因为在编译时就制定了路径 --prefix ),可以查看一下 README 文档,通常的路径是“ /usr/local/arm/x.x.x ”,这时需要将工具包解压到这个路径下。
( 2 )使用 crosstool 自己构建,下面以构建 ARM 交叉编译工具链为例,说明构建步骤。
1. 下载 crosstool-0.43.tar.gz
【 crosstool-0.43.tar.gz 】 http://kegel.com/crosstool/crosstool-0.43.tar.gz
2. 配置 crosstool-0.43
[leo@ crosstool]$ tar zxvf crosstool-0.43.tar.gz
[leo@ crosstool]$ cd crosstool-0.43
[leo @ crosstool-0.43]$ vi demo-arm.sh
修改下面几行,即设置 tarball 的路径、编译结果顶层路径以及需要编译的 gcc 版本。
TARBALLS_DIR=$HOME/Downloads
RESULT_TOP=$HOME/crosstool/arm
eval `cat arm.dat gcc-4.1.1-glibc-2.3.2.dat ` sh all.sh --notest
[leo @ crosstool-0.43]$ vi gcc-4.0.0-glibc-2.3.2.dat
BINUTILS_DIR=binutils-2.16.1
GCC_DIR=gcc-4.0.0
GLIBC_DIR=glibc-2.3.2
LINUX_DIR=linux-2.6.15.4
LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2
GCC_CORE_DIR=gcc-3.3.6
将以上所需的 tarball 放到 $(TARBALLS_DIR) 目录下面。
[leo @ crosstool-0.43]$ vi arm.dat
KERNELCONFIG=`pwd`/arm.config
TARGET=arm-linux
TARGET_CFLAGS="-O"
[leo @ crosstool-0.43]$ ./demo-arm.sh
系统开始编译, 所有使用到的文件 ( 如果没有预先存放在 $(TARBALLS_DIR) 目录下面 ) ,则会在编译的时候自动下载。编译的时间可能需要几个小时。
TARBALLS_DIR :是下载的工具源码压缩包的存放目录。
RESULT_TOP :是要生成的工具链的存放目录,要有写权限的目录,不然无法编译。
3. 所需工具源码压缩包的下载地址
【 binutils-2.16.1.tar.bz2 】 http://ftp.gnu.org/gnu/binutils/
【 gcc-4.0.0.tar.bz2 】 http://ftp.gnu.org/gnu/gcc/gcc-4.0.0/
【 glibc-2.3.2.tar.bz2 】 http://ftp.gnu.org/gnu/glibc/
【 linux-2.6.15.4.tar.bz2 】 http://ftp.kernel.org/pub/linux/kernel/v2.6/
【 glibc-linuxthreads-2.3.2.tar.bz2 】 http://ftp.gnu.org/gnu/glibc/
【 gcc-3.3.6.tar.bz2 】 http://ftp.gnu.org/gnu/gcc/gcc-3.3.6/
【 gdb-6.5.tar.bz2 】 http://ftp.gnu.org/gnu/gdb/
以上就是编译交叉编译工具所用到的源文件组合,这个组合可以成功编译,关于那些组合可以成功编译可以参照 http://kegel.com/crosstool/crosstool-0.43/buildlogs/ 表格。
4. 在 UBUNTU 下编译出现的错误
( 0 )需要安装 bison 和 flex
sudo apt-get install bison flex
( 1 )编译过程中出现一个问题,说是 gcc 版本太旧,其实是 gcc 版本太新了,解决如下:
先查看当前 gcc 的版本 gcc –version ,比如我当前的 gcc 版本 gcc-4.4
sudo apt-get install gcc-3.4
sudo rm /usr/bin/gcc
ln -s /usr/bin/gcc-3.4 /usr/bin/gcc
注意编译完成以后要恢复成原来的版本 , 如下:
sudo rm /usr/bin/gcc
ln -s /usr/bin/gcc-4.3 /usr/bin/gcc
注意:在较新的 UBUNTU 中, sudo apt-get install gcc-3.4 会出现 E: Couldn’t find package gcc-3.4 ,此时需要手动到 http://packages.ubuntu.com/ 去下载较旧版本的安装包,并自行处理包的依赖关系。
( 2 )出现如: build-glibc/csu/version-info.h:1:1: missing terminating " character
系统在编译生成 version.o 时候发现 version-info.h 文件有错误,解决如下:
解压 glibc-2.3.2.tar.bz2
找到 glibc-2.3.2/csu 目录下的 Makefile 按如下修改:
文件末尾有 2 处 echo
echo "/"Compiled on a $$os $$version system" /
"on`date +%Y-%m-%d`.//n/ "" ;; /
改为:
echo "/"Compiled on a $$os $$version system" /
"on `date +%Y-%m-%d`.n/ "" ;; /
echo "/"Available extensions://n/ ""; /
改为:
echo "/"Available extensions: n/ "" /
保存并重新压缩为 glibc-2.3.2.tar.bz2 覆盖原来 $(TARBALLS_DIR) 目录下的 glibc-2.3.2.tar.bz2 ,转到 crosstool-0.43 目录下从新执行。