Linux 交叉工具链的编译

【实验内容】
        通过运用crosstool-0.43.tar.gz脚本工具包来制作自己的交叉编译器。并且此编译器能够编译u-boot,linux内核,以及应用程序。本实验旨在让读者学会一种编译制作交叉编译器的方法。在实际开发中,大多根据编译目标,选择一些编译好的、经过测试的交叉编译器。

【实验环境】
1、ubuntu7.10/8.10/9.10发行版 
2、linux-2.6.14内核 
3、FS2410平台
【实验步骤】

        crosstool是由美国人Dan Kegel(毕业于加(利福尼亚)州工学院)开发的一套可以自动编译不同匹配版本gcc和glibc,并作测试的脚本程序。下载地址:http://kegel.com/crosstool/crosstool-0.43.tar.gz在http://kegel.com/crosstool/crosstool-0.43/buildlogs/可以看到各种CPU和GCC+Glibc版本,哪些已经编译成功,哪些部分成功,哪些彻底失败。
 

注意:

        系统中一般不使用超级用户(root),需要超级用户权限时候用 sudo临时性的提高用户权限。  而编译 crosstool时候,强烈要求不使用 root用户,以免带来灾难性后果

具体实验步骤:
(1)如果你当前用户是超级用户(root)则请登录成普通用户,

首先在系统中安装如下软件包:sudo apt-get install build-essential automake autoconf bison flex libtool

sudo apt-get install libncurses5-dev(或者:sudo apt-get install ncurses-dev)

注意:
 Ubuntu 8.10中 默认安装的 gcc 版本为4.3.2,用此版本编译会出错,目前不宜选用 我们需要选择了 gcc-4.1.3 ,但并不需要卸载 gcc-4.3.2在 Ubuntu 8.10 不要去下 gcc-4.1.3 的源码来编译(自行下载源码编译会发现遇到更多的问题),直接在终端输入sudo apt-get install gcc-4.1安装就可以了然后是sudo rm /usr/bin/gcc       (删除GCC,它只是个到gcc-4.3.2的软链接文件)sudo ln -s /usr/bin/gcc-4.1 /usr/bin/gcc        (建立GCC到gcc-4.1的软链接)如果运行ls -la /bin/sh看到链接的是 dash ,则请运行以下命令
sudo dpkg-reconfigure dash选择 no 以删除 dash,此处如果不改好的话,编译时会出现错误

 

(2)创建工作目录并拷贝相关的软件包$mkdir /home//downloads把需要用的工具包拷贝到downloads目录中。

用到的工具包如下(gcc-3.4.5-glibc-2.3.6.dat中有说明,如果您的linux环境可以上网,则后面用到的安装脚本会自动下载需要的数据包):        
gcc-3.4.5.tar.gz           glibc-2.3.6.tar.gz         linux-2.6.14.tar.gz           crosstool-0.43.tar.gz          

binutils-2.15.tar.gz        glibc-linuxthreads-2.3.3.tar.gz   linux-libc-headers-2.6.12.0.tar.bz2              gdb-6.5.tar.bz2
把他们拷贝到 /home/farsight/downloads:

(3)解压软件包,并进入该目录,查看重要的脚本文件。   $ cd downloads   $ tar –zxvf crosstool-0.43.tar.gz    $ cd crosstool-0.43

在此目录下可以看到有很多.sh脚本和.dat配置文件,每一个支持的处理器都有它所相应的脚本。假如选用demo-arm-softfloat.sh 就是建立目标为支持软浮点的arm交叉编译工具链。 

(4)$vim demo-arm-softfloat.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/downloads   //表示下载的源码的存放目录
RESULT_TOP=$HOME/crosstool //表示生成的工具链的存放目录
export TARBALLS_DIR RESULT_TOP
GCC_LANGUAGES="c,c++" //表示将要生成的工具链支持的语言
export GCC_LANGUAGES
# 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-softfloat.dat gcc-2.95.3-glibc-2.1.3.dat` sh all.sh --notest
#eval `cat arm-softfloat.dat gcc-2.95.3-glibc-2.2.2.dat` sh all.sh --notest
#eval `cat arm-softfloat.dat gcc-2.95.3-glibc-2.2.5.dat` sh all.sh --notest
#eval `cat arm-softfloat.dat gcc-3.2.3-glibc-2.2.5.dat` sh all.sh --notest
#eval `cat arm-softfloat.dat gcc-3.2.3-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm-softfloat.dat gcc-3.2.3-glibc-2.3.2-tls.dat` sh all.sh --notest
#eval `cat arm-softfloat.dat gcc-3.3.6-glibc-2.2.2.dat` sh all.sh --notest
#eval `cat arm-softfloat.dat gcc-3.3.6-glibc-2.2.5.dat` sh all.sh --notest
#eval `cat arm-softfloat.dat gcc-3.3.6-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm-softfloat.dat gcc-3.3.6-glibc-2.3.2-tls.dat` sh all.sh --notest
#eval `cat arm-softfloat.dat gcc-3.4.5-glibc-2.2.5.dat` sh all.sh --notest
#eval `cat arm-softfloat.dat gcc-3.4.5-glibc-2.3.5.dat` sh all.sh --notest
eval `cat arm-softfloat.dat gcc-3.4.5-glibc-2.3.6.dat` sh all.sh --notest  --gdb
# 本实验中选择本行,并注意在后面添加--gdb 使得能生产调试工具

echo Done.
//上面表示你要选工具链的版本号!"#"起注释功能!可以选择一行!

小提示:
如果编译过程中出现错误,可在再次执行./demo-arm-softfloat.sh前,eval `cat arm-softfloat.dat gcc-3.4.5-glibc-2.3.6.dat` sh all.sh --notest  --gdb末尾处加--nounpack表示不重新解压安装包,目的是让安装过程继续进行,而不覆盖掉以前的编译结果。

最终修改后的文件是这样的:

#!/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/downloads
RESULT_TOP=$HOME/crosstool
export TARBALLS_DIR RESULT_TOP
GCC_LANGUAGES="c,c++"
export GCC_LANGUAGES
 
# 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-softfloat.dat gcc-2.95.3-glibc-2.1.3.dat` sh all.sh --

notest
#eval `cat arm-softfloat.dat gcc-2.95.3-glibc-2.2.2.dat` sh all.sh --
notest
#eval `cat arm-softfloat.dat gcc-2.95.3-glibc-2.2.5.dat` sh all.sh --
notest
#eval `cat arm-softfloat.dat gcc-3.2.3-glibc-2.2.5.dat` sh all.sh
--notest
#eval `cat arm-softfloat.dat gcc-3.2.3-glibc-2.3.2.dat` sh all.sh
--notest
#eval `cat arm-softfloat.dat gcc-3.2.3-glibc-2.3.2-tls.dat` sh all.sh
--notest
#eval `cat arm-softfloat.dat gcc-3.3.6-glibc-2.2.2.dat` sh all.sh
--notest
#eval `cat arm-softfloat.dat gcc-3.3.6-glibc-2.2.5.dat` sh all.sh
--notest
#eval `cat arm-softfloat.dat gcc-3.3.6-glibc-2.3.2.dat` sh all.sh
--notest
#eval `cat arm-softfloat.dat gcc-3.3.6-glibc-2.3.2-tls.dat` sh all.sh
--notest
#eval `cat arm-softfloat.dat gcc-3.4.5-glibc-2.2.5.dat` sh all.sh
--notest#eval `cat arm-softfloat.dat gcc-3.4.5-glibc-2.3.5.dat` sh all.sh
--notest
eval `cat arm-softfloat.dat gcc-3.4.5-glibc-2.3.6.dat` sh all.sh
--notest --gdb
 
echo Done.

 

 

 demo-arm-softfloat.sh这个脚本在执行的时候,是执行的eval `cat arm-softfloat.dat gcc-3.4.5-glibc-2.3.6.dat` sh all.sh –notest这个批处理文件。打开这个文件 
(5)$ vim 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.8
LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.6
由于交叉编译器是编译2.6.14的内核,那么修改LINUX_DIR=linux-2.6.14  另外,我们需要增加GDB的调试功能,在LINUX_DIR这一行后面增加一行:GDB_DIR=gdb-6.5

 最终修改后是这样的:

BINUTILS_DIR=binutils-2.15
GCC_DIR=gcc-3.4.5
GLIBC_DIR=glibc-2.3.6
LINUX_DIR=linux-2.6.14
GDB_DIR=gdb-6.5
LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.6

(6)vim arm-softfloat.dat
 KERNELCONFIG=`pwd`/arm.config
TARGET=arm-softfloat-linux-gnu
TARGET_CFLAGS="-O"
GCC_EXTRA_CONFIG="--with-float=soft"
GLIBC_EXTRA_CONFIG="--without-fp"
 最终修改后是这样的:

KERNELCONFIG=`pwd`/arm.config
TARGET= arm-softfloat-linux-gnu (这个名字可以改成你
想要的交叉工具链前缀名)
TARGET_CFLAGS="-O"
GCC_EXTRA_CONFIG="--with-float=soft"
GLIBC_EXTRA_CONFIG="--without-fp"

这个时候,就可以执行编译脚本了。
(7)$ ./demo-arm-softfloat.sh 约1个多小时后,编译完毕。

注意:
1.如果是在Ubuntu7.10 系统上进行编译,编译会出错 (这个是在编译过程中产生,所以无法事先解决。约30分钟) 这时候修改build/arm-softfloat-linux-gnu/gcc-3.4.5-glibc-2.3.6/build-glibc/csu/version-info.h
改成:
"Compiled on a Linux >>2.6.20-15-generic<< system on 2008-01-30.\n"
"Available extensions:\n"
"\n"
" GNU libio by Per Bothner\n"
" crypt add-on version 2.1 by Michael Glad and others\n"
" linuxthreads-0.10 by Xavier Leroy\n"
" BIND-8.2.3-T5B\n"
" libthread_db work sponsored by Alpha Processor Inc\n"
" NIS(YP)/NIS+ NSS modules 0.19 by Thorsten Kukuk\n"
在再次执行./demo-arm-softfloat.sh前,请在eval `cat arm-softfloat.dat gcc-3.4.5-glibc-2.3.6.dat` sh all.sh --notest  --gdb末尾处加--nounpack表示不重新解压安装包,目的是让安装过程继续进行,而不覆盖掉以前的编译结果。
再次执行:
./demo-arm-softfloat.sh
(约50分钟)
  2.UBUNTU9.10 上工具链的编译执行./demo-arm-softflaot.sh过程中会出现下面的错误:编译过程中会出现:
*** "These critical programs are missing or too old" as ld
解决方法如下:

修改下面的文件:
vi ./build/arm-softfloat-linux-gnu/gcc-3.4.5-glibc-2.3.6/glibc-2.3.6/configure +4425

4419 test -n "$critic_missing" && { { echo "$as_me:$LINENO: error:
4420 *** These critical programs are missing or too old:$critic_missing
4421 *** Check the INSTALL file for required versions." >&5
4422 echo "$as_me: error:

4423 *** These critical programs are missing or too old:$critic_missing
4424 *** Check the INSTALL file for required versions." >&2;}
{ (exit 1); exit 1; };}
改为:
4419 test -n "$critic_missing" && { { echo "$as_me:$LINENO: error:
4420 *** These critical programs are missing or too old:$critic_missing
4421 *** Check the INSTALL file for required versions." >&5
4422 echo "$as_me: error:
4423 *** These critical programs are missing or too old:$critic_missing
4424 *** Check the INSTALL file for required versions." >&2;}
#{ (exit 1); exit 1; };
}
在再次执行./demo-arm-softfloat.sh前,请在eval `cat arm-softfloat.dat gcc-3.4.5-glibc-2.3.6.dat` sh all.sh --notest  --gdb末尾处加--nounpack表示不重新解压安装包,目的是让安装过程继续进行,而不覆盖掉以前的编译结果。
再次执行:
./demo-arm-softfloat.sh

(8)在利用它编译内核之前还要设置环境变量     $export PATH=/opt/crosstool/gcc-3.4.5-glibc-2.3.6/arm-linux-gnu/bin:$PATH         $source /etc/profile  以上是在当前终端上设置环境变量,如果要添加到系统环境变量中,请在/etc/profile中export PATH之前添加如下一行:        
  # sudo vi /etc/profile (输入root密码)
  PATH=/opt/crosstool/gcc-3.4.5-glibc-2.3.6/arm-linux-gnu/bin:$PATH     export PATH
保存并退出VI     之后可重启系统,或者在终端窗口中执行:
       #
       $source /etc/profile 
 (9) 下面就可以用这个交叉编译器来进行实验了

(10) 编译内核【选做】
 设置内核Makefile      
   $ cd kernel/linux-2.6.14
   $ vim Makefile
确保 
     ARCH             ?=  arm
     CROSS_COMPILE    ?=arm-softfloat-linux-gnu-

 
这个时候可以利用这个编译器编译内核了,但编译内核的实验还会涉及到其它的内容。这些内容将在系统移植实验有联系。

说明:
交叉工具链编译完毕后,可以运行以下命令修改回来原先的设置sudo rm /usr/bin/gccsudo ln -s /usr/bin/gcc-4.3 /usr/bin/gccsudo dpkg-reconfigure dash选择 yes 以重新恢复sh为dash

 

你可能感兴趣的:(linux,脚本,gcc,工具,makefile,编译器)