Crosstool是由美国人Dan Kegel(毕业于加(利福尼亚)州工学院)开发的一套可以自动编译不同匹配版本gcc和glibc,并作测试的脚本程序。Crosstool最初是为嵌入式系统开发者创建,但也适用于主流开发者比如只是希望他们去快速编译或需要建立程序,可运行在旧版本的Linux操作系统(例如Red Hat的6.2 )。Crosstool是一种便携式的shell脚本。你可以使用它来建立Linux系统配置的编译器是运行在Linux , Mac OS X操作系统, Solaris和Cygwin等。它支持的硬件平台有:alpha, arm, i686, ia64, mips, powerpc, powerpc64, sh4, sparc, sparc64, s390, x86_64等。
在实践之前,我们需要回答这样的问题,为什么要使用交叉编译器?主要原因是嵌入式硬件(目标机)的性能一般都无法满足开发环境的要求,比如主频比较低、内存少、没有硬盘(常用FLASH作为存储设备)、没有大型显示设备、没有全键盘等。交叉编器通常是采用PC(x86)作为主机来搭建开发环境进行编译,但编译出的软件能够在特定CPU体系架构的目标设备(比如ARM设备)上运行的一套编译工具。
下面将以具体操作步骤来讲述Crosstool构建针对ARM平台的交叉编译器。注:该实验是基于Fedora 10操作系统下进行,其他Linux发行版可能会有所不同。
1.准备资源文件
软件包名称
|
下载站点
|
crosstool-0.43.tar.gz
|
http://kegel.com/crosstool/crosstool-0.43.tar.gz
|
binutils-2.15.tar.bz2
|
http://ftp.gnu.org/gnu/binutils/
|
gcc-3.4.5.tar.bz2
|
http://ftp.gnu.org/gnu/gcc
|
glibc-2.3.6.tar.bz2
|
http://ftp.gnu.org/gnu/glibc
|
glibc-linuxthreads-2.3.6.tar.bz2
|
http://ftp.gnu.org/gnu/glibc
|
linux-2.6.24.4.tar.bz2
|
http://ftp.kernel.org/pub/linux/kernel/v2.6/
|
linux-libc-headers-2.6.12.0.tar.bz2
|
http://ep09.pld-linux.org/~mmazur/linux-libc-headers/
|
[root@localhost root]# cd /mnt/hgfs/linux/
//通过VMware Tool虚拟机工具的安装,可以实现共享,切换到共享目录/mnt/hgfs/linux
[root@localhost linux]# ls
//显示目录下的所有文件及安装包
binutils-2.15.tar.bz2 glibc-linuxthreads-2.3.6.tar.bz2
crosstool-0.43.tar.gz linux-2.6.24.4.tar.bz2
gcc-3.4.5.tar.bz2 linux-libc-headers-2.6.12.0.tar.bz2
glibc-2.3.6.tar.bz2
[root@localhost linux]# mkdir /home/user/downloads
//创建交叉编译器源代码存放目录
[root@localhost linux]# mkdir /opt/crosstool
//创建交叉编译器安装目录
[root@localhost linux]# tar -zxvf crosstool-0.43.tar.gz -C /home/user/
//将交叉编译器工具解压到/home/user目录,这个目录可以自己拟定。
[root@localhost linux]# cp * /home/user/downloads/
[root@localhost linux]# rm -rf /home/user/downloads/crosstool-0.43.tar.gz
[root@localhost linux]# ls -ld /home/user/downloads/*
[root@localhost linux]# cd /home/user/crosstool-0.43/
//切换到交叉编译工具目录
[root@localhost crosstool-0.43]# pwd
//显示当前目录
/home/user/crosstool-0.43
[root@localhost crosstool-0.43]# cp demo-arm.sh arm.sh
//将arm.sh执行脚本模块拷贝一份进行修改
[root@localhost crosstool-0.43]# vi arm.sh
//编辑arm.sh脚本
#!/bin/sh
# This script has one line for each known working toolchain
# for this architecture. Uncomment the one you want.
# Generated by generate-demo.pl from buildlogs/all.dats.txt
set -ex
TARBALLS_DIR=/home/user/downloads #定义工具链源码所存放位置 ,下载的源码包目录
RESULT_TOP=/opt/crosstool #定义工具链的安装目录
export TARBALLS_DIR RESULT_TOP
GCC_LANGUAGES="c,c++,java" #定义支持c,c++,Java
export GCC_LANGUAGES
# 创建/opt/crosstool目录
# Really, you should do the mkdir before running this,
# and chown /opt/crosstool to yourself so you don't need to run as root.
mkdir -p $RESULT_TOP
#编译工具链,该过程需要数小时完成
eval `cat arm.dat gcc-3.4.5-glibc-2.3.6.dat` sh all.sh --notest
#eval `cat arm.dat gcc-4.1.0-glibc-2.3.2-tls.dat` sh all.sh –notest
#默认是执行这个两个文件配置cat arm.dat gcc-4.1.0-glibc-2.3.2-tls.dat
echo Done.
[root@localhost crosstool-0.43]# vi arm.dat
KERNELCONFIG=`pwd`/arm.config #内核的配置
TARGET=arm-softfloat-linux #编译生成的工具链名称
TARGET_CFLAGS="-O" #编译选项
GCC_EXTRA_CONFIG="--with-float=soft" #支持software FP
GLIBC_EXTRA_CONFIG="--without-fp"
[root@localhost crosstool-0.43]# vi gcc-3.4.5-glibc-2.3.6.dat
BINUTILS_DIR=binutils-2.15
GCC_DIR=gcc-3.4.5
GLIBC_DIR=glibc-2.3.6
LINUX_DIR=linux-2.6.24.4
LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.6
[root@localhost crosstool-0.43]# ./arm.sh
如果不修改crosstool-0.43目录下的编译平台编译器,执行arm.sh脚本,默认就会显示TARGET平台为arm-unknown-linux-gun,所以我们需要编译器类型为TARGET=arm-softfloat-linux软浮点类型。U-boot高版本的启动程序支持软浮点型。编译U-boot以后就不会出现硬浮点类型错误了,解决下面问题用普通用户执行。
[root@localhost crosstool-0.43]# su user
//切换普通用户
[user@localhost crosstool-0.43]$ ./arm.sh
//执行安装脚本,普通用户创建目录有出现权限问题,在切换到超级用户。在执行arm.sh安装脚本
[user@localhost crosstool-0.43]$ su
Password:******
[root@localhost crosstool-0.43]# ./arm.sh
如果没有不出什么意外的话,数小时后就编译好了!
经过数小时的漫长编译之后,会在/opt/crosstool/gcc-3.4.5-glibc-2.3.6/arm-linux/bin目录下生成新的交叉编译工具,其中包括以下内容:
[root@localhost bin]# vi /root/.bash_profile
/opt/crosstool/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux/bin
[root@localhost bin]# source /root/.bash_profile
[root@localhost bin]# ar