用crosstool工具建立交叉工具链过程记录

来源:互联网 发布:剑三苍云捏脸数据 编辑:程序博客网 时间:2024/06/07 07:02
首先建立工作目录(注意,权限问题所以需要加sudo,后面很多动作都要加):
[cpp] view plaincopy
  1. $ mkdir /home/lee/arm  
  2. $ mkdir /home/lee/arm/downloads  

    下载诸多文件包:  

[cpp] view plaincopy
  1. crosstool-0.43.tar.gz  
  2. linux-2.6.15.tar.gz  
  3. binutils-2.16.tar.gz  
  4. gcc-4.1.0.tar.gz  
  5. glibc-2.3.2.tar.gz  
  6. glibc-linuxthreads-2.3.2.tar.gz  
  7. linux-libc-header-2.6.12.0.tar.bz2  
    将其中的后六个文件包放置在/home/lee/arm/downloads文件夹内。将crosstool工具解压:
[cpp] view plaincopy
  1. tar -zxvf crosstool-0.43.tar.gz  
    现在已经做好了准备工作,下面正式开始:

    一.建立脚本文件

     因为本次交叉编译是为了在arm9架构的处理器s3c2440开发板上用,我们要创建的是针对于arm9tdmi架构的arm-linux-gcc,应用crosstool提供的模板:demo-arm9tdmi.sh。首先要修改:

[cpp] view plaincopy
  1. $ cd crosstool-0.43  
  2. $ gedit demo-arm9tdmi.sh  
    修改文件中的:

[cpp] view plaincopy
  1. TARBALLS_DIR=$HOME/arm/downloads  
  2. RESULT_TOP=/opt/crosstool  
  3. ...  
  4. eval 'cat arm9tdmi.dat gcc-4.1.0-glibc-2.3.2-tls.dat' sh all.sh -notest  
  5. ...  
    TARBALLS_DIR指定保存的源代码路径;如果不指定的话,crosstool在制作交叉编译工具过程中会使用wget自动下载(不过最好还是先下载好)。RESULT_TOP指定了最后编译好的工具保存路径,注意/opt/crosstool目录要提前在root权限下创建,并更改访问权限(例如:chmod 777 /opt/crosstool。开放全部权限,一了百了)。eval句是gcc和glibc的组合,根据需要选取,这里和我们在/downloads目录下已经下载好的源码包吻合。HOME是bash环境变量,此处 HOME为我的用户目录:/home/lee。

   二.建立配置文件

    demo-arm9tdmi.sh脚本文件会访问demo-arm9tdmi.dat和gcc-4.1.0-glibc-2.3.2.dat两个文件,这两个文件是crosstool编译的配置文件。

    demo-arm9tdmi.dat文件用于定义内核配置,定义生成工具链的名称(如arm-linux-gcc),以及编译选项,我们只修改生成工具链名称,其他默认。如下:

[cpp] view plaincopy
  1. TARGET=arm-linux-  
    gcc-4.1.0-glibc-2.3.2.dat文件定义了编译过程中所需要的库和其具体版本,如果在编译过程中用发现某些库不存在的话会自动从相关网站下载(在getandpath.sh文件中)。不过在这里,因为我们已经提前下好了编译需要的文件包,所以,可以修改这个文件中的版本号为已下载文件的相应版本号。这样,在编译过程中就不需要再从网站下载(况且,那些自动下载关联的网站有的已经失效,或者不存在我们需要的版本文件包)。修改如下:

[cpp] view plaincopy
  1. # /arm/downloads/gcc-4.1.0-glibc-2.3.2.dat  
  2. BINUTILS_DIR=binutils-2.16.1  
  3. GCC_CORE_DIR=gcc-3.3.6  
  4. GCC_DIR=gcc-4.1.0  
  5. GLIBC_DIR=glibc-2.3.2  
  6. LINUX_DIR=linux-2.6.15  
  7. LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0  
  8. GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2  
  9. GDB_DIR=gdb-6.5  
    在第一次编译过程中出问题,从网上搜到gdb-6.5文件中有文件参数不对,因为gcc-4.1的编译对参数要求严格,修改后可以通过。

   三.执行脚本

    在执行脚本前发生了小插曲,系统中的gcc是gcc-4.4版本的,太过于新以至于编译过程中提示gcc版本太旧(无语,linux的自由带给普通开发者的是无穷的变数与不确定;不统一的版本,各种的不一致不协调。这本身就是一种巨大的障碍,自由之祸)。后参考网上教程编译安装了gcc-3.3.6,注意编译好gcc-3.3.6后,一定要和系统里gcc建立链接,我采取了把原来链接(gcc和gcc-4.4链接一起)删除,然后建立新的链接:

[cpp] view plaincopy
  1. $ rm /usr/bin/gcc  
  2. $ ln -s /opt/crosstool/gcc-4.1.0-glibc-2.3.2/arm-linux/bin/gcc gcc  
     一切都已就绪,开始编译:

[cpp] view plaincopy
  1. $ cd $HOME/arm/crosstool-0.43  
  2. $ ./demo-arm9tdmi.sh  
     然后就是漫长的等待,没有注意时间,应该再一个小时以上。最后,在/opt/crosstool/gcc-4.1.0-glibc-2.3.2/arm-linux/bin/下就是生成的新的工具,如arm-linux-gcc arm-linux-g++ 等等。

     最后将工具链所在路径添加到环境变量PATH中去,以方便在终端环境下直接调用相应工具。方法是用root打开/etc/bash.bashrc文件,在最后一行添加:

[html] view plaincopy
  1. export PATH=/opt/crosstool/gcc-4.1.0-glibc-2.3.2/arm-linux/bin:$PATH  
     至此,crosstool工具链建立结束。

    在整个编译过程中,发现了太多的不确定的东西,在编译过程中会出现各种文件确实和编译错误。原因一方面是因为某些文件本身存在bug(如gdb-6.5的一行代码在gcc-4.1下根本编译不过去),另一方面是因为linux的不断变化不断更新,致使很多文件都“不配套“。这些东西确实很让人气馁。

    作此小结,继续努力。


    2012.1.7 by lee

    reference:

        <<嵌入式linux系统开发教程>> 贺丹丹 清华大学出版社

        网络上诸多帖子,不一一列举。


转载自:http://blog.csdn.net/lhw88117/article/details/7183896

原创粉丝点击