1. 准备资源
需要的软件包:binutils-2.15.tar.gz、gcc-3.4.5.tar.gz、glibc-2.3.6.tar.gz、glibc-linuxthreads-2.3.6.tar.gz、linux-libc-headers-2.6.12.0.tar.bz2。可通过下面的命令下载:
#wget -c ftp://ftp.gnu.org/gnu/binutils/binutils-2.15.tar.gz
#wget -c ftp://ftp.gnu.org/gnu/gcc/gcc-3.4.5.tar.gz
#wget -c ftp://ftp.gnu.org/gnu/glibc/glibc-2.3.6.tar.gz
#wget -c ftp://ftp.gnu.org/gnu/glibc/glibc-linuxthreads-2.3.6.tar.gz
#wget -c ftp://ftp.lfs-matrix.net/pub/linux-libc-headers/linux-libc-headers-2.6.12.0.tar.bz2或网址:http://kegel.com/crosstool/crosstool-0.43.tar.gz
下载软件包,放到/home/weimen/downloads目录下。下载最新版本的crosstool,网址:http://kegel.com/crosstool/crosstool-0.43.tar.gz
编译的过程中可能会出错,导致编译过程无法继续进行。最好的办法是将编译过程中的信息保存成日志文件,方便后面的分析。
可使用下面的方法:
#make 2>&1 | tee xxx.log <----------------tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件
2.建立脚本文件
#cd /home/weimen/
#tar -zxvf crosstool-0.43.tar.gz
#cd crosstool-0.43
#cp demo-arm.sh arm.sh
#vi arm.sh
修改之后的arm.sh的内容如下:
#!/bin/sh
set -ex
TARBALLS_DIR=/home/weimen/downloads <----------------定义工具链源码所存放位置
RESULT_TOP=/opt/crosstool <----------------RESULT_TOP指的是编译好后所生成的交叉编译器存放的目录,一定要改到有写权限的目录,不然无法编译。
export TARBALLS_DIR RESULT_TOP
GCC_LANGUAGES="c,c++" <----------------定义支持C, C++语言
export GCC_LANGUAGES
mkdir -p $RESULT_TOP <----------------创建/opt/crosstool目录
eval `cat arm.dat gcc-3.4.5-glibc-2.3.6.dat` sh all.sh --notest <----------------编译工具链,该过程需要数小时完成。
echo Done.
3.建立配置文件
在arm.sh脚本文件中需要注意arm.dat和gcc-3.4.5-glibc-2.3.6.dat两个文件,这两个文件是作为Crosstool的编译的配置文件。其中 arm.dat文件内容如下,主要用于定义配置文件、定义生成编译工具链的名称以及定义编译选项等。
其中arm.dat的内容如下:
KERNELCONFIG=`pwd`/arm.config <----------------内核的配置
TARGET=arm-linux <----------------编译生成的工具链名称
TARGET_CFLAGS="-O" <----------------编译选项
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
4.执行脚本
将Crosstool的脚本文件和配置文件准备好之后,开始执行arm.sh脚本来编译交叉变异工具。具体执行命令如下:
#chmod 777 /home/weimen/crosstool-0.43
#cd crosstool-0.43
#su weimen <----------------不要以root用户运行,否则会出错
#./arm.sh
中途出现的错误:
1)
chmod: changing permissions of `/home/weimen/crosstool-0.43/config.guess': Operation not permitted
GLIBC_ADDON_OPTIONS not set, so guessing addons from GLIBCTHREADS_FILENAME and GLIBCCRYPT_FILENAME
/home/weimen/crosstool-0.43/crosstool.sh: line 110: bison: command not found
crosstool: You don't have bison installed.
#apt-get install bison <----------------语法分析器
2)
chmod: changing permissions of `/home/weimen/crosstool-0.43/config.guess': Operation not permitted
GLIBC_ADDON_OPTIONS not set, so guessing addons from GLIBCTHREADS_FILENAME and GLIBCCRYPT_FILENAME
/home/weimen/crosstool-0.43/crosstool.sh: line 111: flex: command not found
crosstool: You don't have flex installed
#apt-get install flex <----------------词法分析器
3)
configure: error: Unrecognized target system type; please check config.sub.
make: *** [configure-bfd] Error 1
#arm.dat中工具链的名称:"TARGET=arm-linux-"改为"TARGET=arm-linux"
经过漫长的编译之后,会在/opt/crosstool/gcc-3.4.5-glibc-2.3.6/arm-linux/bin目录下生成新的交叉编译工具,其中包括以下内容:
#ls /opt/crosstool/gcc-3.4.5-glibc-2.3.6/arm-linux/bin/
arm-linux-addr2line arm-linux-c++ arm-linux-g++ arm-linux-gccbug arm-linux-ld arm-linux-objdump arm-linux-size fix-embedded-paths
arm-linux-ar arm-linux-c++filt arm-linux-gcc arm-linux-gcov arm-linux-nm arm-linux-ranlib arm-linux-strings
arm-linux-as arm-linux-cpp arm-linux-gcc-3.4.5 arm-linux-gprof arm-linux-objcopy arm-linux-readelf arm-linux-strip
5. 添加环境变量
#vi ~/.profile
add
PATH=$PATH:$HOME/bin:/opt/crosstool/gcc-3.4.5-glibc-2.3.6/arm-linux/bin
export PATH
or
export PATH=/opt/crosstool/gcc-3.4.5-glibc-2.3.6/arm-linux/bin:$PATH
#source /home/weimen/.profile <----------------不用重启,使环境变量生效。
#printenv <----------------查看环境变量
下面的来自于:http://www.top-e.org/jiaoshi/html/?392.html
补充问题:
S3C2440芯片没有硬件浮点数(hardfloat),很多软件只能采用软件浮点数(softfloat)的编译器编译,恰巧现在高版本的u-boot只能采用支持softfloat的交叉编译器编译,否则会在编译结束前的链接那一步出现不支持softfloat的错误。
解决办法:
要解决这个错误的唯一办法就是采用支持softfloat的交叉编译器编译uboot。下面来说一下制作softfloat的具体过程。
和上述制作交叉编译器过程一样,不同之处:1.修改arm.dat内容如下,参考arm-softfloat.dat内容修改。
KERNELCONFIG=`pwd`/arm.config
TARGET=arm-softfloat-linux
TARGET_CFLAGS="-O"
GCC_EXTRA_CONFIG="--with-float=soft"
GLIBC_EXTRA_CONFIG="--without-fp"
编译完之后,会在/opt/crosstool/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux/bin生成支持softfloat的交叉编译器,如下所示。
arm-softfloat-linux-addr2line arm-softfloat-linux-g++ arm-softfloat-linux-ld arm-softfloat-linux-size arm-softfloat-linux-ar arm-softfloat-linux-gcc arm-softfloat-linux-nm arm-softfloat-linux-strings arm-softfloat-linux-as arm-softfloat-linux-gcc-3.4.5 arm-softfloat-linux-objcopy arm-softfloat-linux-strip