用crosstool-ng建立自己的ARM交叉编译工具链

一、下载crosstool-ng
   crosstool-ng的下载地址是:http://ymorin.is-a-geek.org/download/crosstool-ng/
   最好下载最新版本。

二、准备crosstool-ng的安装环境

    apt-get搞定

    必备工且包括:

    1.bison

    2.flex

    3.makeinfo ---> texinfo  (实际安装的是后者,下同)

    4.automake

    5.libtool

    7.cvs

    8.patch

    9.ncurses/ncurses.h  |

       ncurses/curses.h    |  \  -->libncurses5-dev

       ncurses.h                | /

       curses.h                  |

       ....

     10.aria2c --- > aria2 (选择安装,可以不装的)

     11.curl  (同样选择安装,可以不装)

     12.gcj

     13.g++

     14.svn ---> subversion

  15. gwak   

  16. cvsd 

    使用命令 $ sudo apt-get install xxx 依次安装

如果还差什么库的话可以自己在搜一下,apt-get就可以安装了。

三、安装crosstool-ng

    1)配置 sudo ./configure --prefix=/usr/local/arm/crosstool-ng       #配置安装目录为/usr/loca/arm/crosstool-ng

    2)编译 sudo make

    3)安装  sudo make install

四、配置本次编译的交叉编译工具链

    先建立一个交叉工具链的输出目录,比如是~/arm/crosstool_build  (后简称${build})

    根据要建立的工具链,从sample目录拷备相应的配置文件到 ${build}/

    (sample目录在,安装目录:crosstool-ng/lib/ct-ng-1.7.0/samples) 

    本次要建立的是arm-unknown-linux-gnueabi

    所以拷贝 cp crosstool-1.7.0/samples/arm-unknown-linux-gnueabi/* ${build}/

    将config文件改名为 .config(或复制一个) cp crosstool-config .config

    *这里,sample里关于arm有好几种配置,我的理解是

      arm-unknown-eabi是基于裸板跑的,也就是无操作系统

      arm-unknown-linux-gnueabi 是基于linux的

      arm-unknown-linux-uclibcgnueabi 这个应该能看出来了,是为uclinux用的。

      arm-iphone-linux-gnueabi 这个是给iphone用的???没用过,不知道,哈哈。

      arm-cortex_a8-linux-gnueabi 从名字上看是为cortex-a8用的。

      arm-xxx$&#*& 还有几个,基本上是都不理解了。

      想了想,我做两套链,一套armv4t/arm920t (给2410/2440用) 一套armv6/arm1176jzf-s(给6410用)最合适的,应该就是

      arm-unknown-linux-gnueabi  所以,本例中是使用arm-unknown-linux-gnueabi为配置样板的。

五、配置工具链

    为方便后面调用ct-ng 这里先修改环境变量

    #export PATH="${PATH}:/some/place/bin" (/some/place也就是ct-ng的安装目录)

    #cd ${build}    ///这步很重要,后面的操作一定要在这个build目录中执行
    #ct-ng menuconfig

     这里将进入一个类似于内核配置的界面。需要改的项目不多:我只进行了一些简单配置

    (1)很多文章上写要修改path,我懒得改了,反正最后找的到就可以了。所以就不动Paths and misc options项了。

       1、已下载好的源码包路径和交叉编译器的安装路径。(http://blog.chinaunix.net/u1/34474/showart_2198589.html)
    Paths and misc options  --->
      (${HOME}/development/crosstool-ng/src) Local tarballs directory   保存源码包路径
      (${HOME}/development/x-tools/${CT_TARGET}) Prefix directory  交叉编译器的安装路径
    这两个请依据你的实际情况来修改。 

    (2)Target options这是重点要修改的地方。(以下配置均是基于已拷备过来的配置。

        Target Architecture(arm) 这个不用管,已经是arm了。

        Default instruction set mode (arm) 这个也不管,也已经是arm了。

--------------------------------------- (http://blog.chinaunix.net/u1/34474/showart_2198589.html)

   Target options  --->     从datasheet中的 BLOCK DIAGRAM 中可以看到
           *** Target optimisations ***
           (armv4t) Architecture level 
           (arm9tdmi) Emit assembly for CPU    
           (arm920t) Tune for CPU
 --------------------------------------

        Architecture level() 这个要改 ~~

                   通过查找资料,这个应该是指令集的架构,对于S3C2410/S3C2440,都是ARM920T的核心,架构指令是armv4t

                   所以,如果要编译2410/2440的,就选armv4t

                   以此类推

                   S3C6410 ARM1176JZF-S核心 使用的是armv6架构,就选armv6

                   那么,具体都支持哪些架构呢?可以用man gcc来查询,搜索arm,再搜索-march=就可以找到本gcc支持的处理器核心列表了:

           -march=name
           This specifies the name of the target ARM architecture.  GCC uses
           this name to determine what kind of instructions it can emit when
           generating assembly code.  This option can be used in conjunction
           with or instead of the -mcpu= option.  Permissible names are:
           armv2, armv2a, armv3, armv3m, armv4, armv4t, armv5, armv5t, armv5e,
           armv5te, armv6, armv6j, armv6t2, armv6z, armv6zk, armv6-m, armv7,
           armv7-a, armv7-r, armv7-m, iwmmxt, iwmmxt2, ep9312.

        这里有些问题,比如S3C2416处理器,使用的是ARM926EJ-S核心,通过查手册,arm926ej-s的核心是armv5tej,可上述列表中并没有这样的核心。所以,这里就选择一个最相近的核心 armv5te

         Emit assembly for CPU() 这个要改~~

                  这个对应的是CPU的核心类型。

                  同样,也和上面的选项一样,对应一个GCC选项。GCC中这样描述

                  -mcpu=name
           This specifies the name of the target ARM processor.  GCC uses this
           name to determine what kind of instructions it can emit when
           generating assembly code.  Permissible names are: arm2, arm250,
           arm3, arm6, arm60, arm600, arm610, arm620, arm7, arm7m, arm7d,
           arm7dm, arm7di, arm7dmi, arm70, arm700, arm700i, arm710, arm710c,
           arm7100, arm720, arm7500, arm7500fe, arm7tdmi, arm7tdmi-s, arm710t,
           arm720t, arm740t, strongarm, strongarm110, strongarm1100,
           strongarm1110, arm8, arm810, arm9, arm9e, arm920, arm920t, arm922t,
           arm946e-s, arm966e-s, arm968e-s, arm926ej-s, arm940t, arm9tdmi,
           arm10tdmi, arm1020t, arm1026ej-s, arm10e, arm1020e, arm1022e,
           arm1136j-s, arm1136jf-s, mpcore, mpcorenovfp, arm1156t2-s,
           arm1176jz-s, arm1176jzf-s, cortex-a8, cortex-a9, cortex-r4,
           cortex-r4f, cortex-m3, cortex-m1, xscale, iwmmxt, iwmmxt2, ep9312.

              这样看简单一些了如果是 S3C2410/S3C2440 就选 arm920t  如果是s3c6410就选arm1176jzf-s

              如果是s3c2416就选 arm926ej-s

5、增加编译时的并行进程数,以增加运行效率,加快编译。

Paths and misc options  --->
   *** Build behavior *** 
   (4) Number of parallel jobs 
   这个数值不宜过大,应该为CPU数量的两倍。由于我的CPU是双核的,所以我填了4.

6、一些个性化的修改(可以不修改)
Toolchain options  --->
       *** Tuple completion and aliasing ***  
       (tekkaman) Tuple's vendor string 
这样产生的编译器前缀就是:arm-tekkaman-linux-gnueabi-


PS:如果出现什么错误可以参照:http://blog.csdn.net/hqjma/article/details/8885050

我出现了automatic de-ANSI-fication support has been removed

参照这个解决了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值