嵌入式LINUX ---ARM交叉编译工具链的编译

 

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

【编译环境】

1Redhat9.0发行版 

2linux- 2.6.14 内核 

【编译步骤】

crosstool是由美国人Dan Kegel(毕业于加(利福尼亚)州工学院)开发的一套可以自动编译不同匹配版本gccglibc,并作测试的脚本程序。下载地址:

http://kegel.com/crosstool/crosstool-0.43.tar.gz

http://kegel.com/crosstool/crosstool-0.43/buildlogs/可以看到各种CPUGCC+Glibc版本,哪些已经编译成功,哪些部分成功,哪些彻底失败。

 

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

 

 

具体实验步骤:

1)如果你当前用户是超级用户(root)则请登录成普通用户(在我们的试验中用farsight用户)    

 

2)创建工作目录并拷贝相关的软件包

$mkdir /home/farsight/downloads

把需要用的工具包拷贝到downloads目录中。用到的工具包如下(gcc- 3.4.5 -glibc-2.3.6.dat有说明,如果您的linux环境可以上网,则后面用到的安装脚本会自动下载需要的数据包):

l         gcc- 3.4.5 .tar.gz 

l         glibc- 2.3.6 .tar.gz 

l         linux- 2.6.14 .tar.gz

l         crosstool-0.43.tar.gz

l         binutils-2.15.tar.gz 

l         glibc-linuxthreads- 2.3.3 .tar.gz

l         linux-libc-headers- 2.6.12 .0.tar.bz2

l      gdb-6.5.tar.bz2

在/home/farsight/labs/1stDay/addlabs/cross_toolchains目录下有这些包,把他们拷贝到 /home/farsight/downloads:

$ cp /home/farsight/labs/1stDay/addlabs/cross_toolchains/*.tar.*  /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/farsight/downloads   //表示下载的源码的存放目录

RESULT_TOP=/opt/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.

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

TARBALLS_DIR改为TARBALLS_DIR=/home/farsight/downloads

RESULT_TOP改为RESULT_TOP=/home/farsight/crosstool

 

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

#!/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/farsight/downloads
RESULT_TOP=/opt/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.
 
 

另外, 由于我们要在/opt下面最后安装工具链,需要先让farsight具有/opt的可写权限,简单处理一下:

$ chmod 777 /opt

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"
    将 TARGET 修改 arm-linux-gnu

 

 最终修改后是这样的:

KERNELCONFIG=`pwd`/arm.config
TARGET=arm-linux-gnu
TARGET_CFLAGS="-O"
GCC_EXTRA_CONFIG="--with-float=soft"
GLIBC_EXTRA_CONFIG="--without-fp"

 

这个时候,就可以执行编译脚本了。

7$ ./ demo-arm-softfloat.sh

1个多小时后,编译完毕。

注: 如果编译过程遇到问题,在改正问题前,请eval `cat arm-softfloat.dat gcc- 3.4.5 -glibc-2.3.6.dat` sh all.sh --notest  --gdb末尾处加--nounpack表示不重新解压安装包,目的是让安装过程继续进行,而不覆盖掉以前的编译结果。

 

(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之前添加如下一行:

        $ su root  (输入root密码)

        # vi /etc/profile

        PATH=/opt/crosstool/gcc-3.4.5-glibc-2.3.6/arm-linux-gnu/bin:$PATH
               export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC


          之后可重启系统,或者在终端窗口中执行:

       # exit

       $source /etc/profile

 

 下面就可以用这个交叉编译器来编译应用程序和内核了。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值