用crosstool创建交叉编译环境

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

arm-softfloat-linux-c++      arm-softfloat-linux-gccbug     arm-softfloat-linux-objdump  fix-embedded-paths  arm-softfloat-linux-c++filt    arm-softfloat-linux-gcov       arm-softfloat-linux-ranlib arm-softfloat-linux-cpp        arm-softfloat-linux-gprof      arm-softfloat-linux-readelf

你可能感兴趣的:(linux,C)