用crosstool-ng建立自己的ARM交叉编译工具链 (适用于S3C6410以及其它处理器)

一、下载crosstool-ng
   crosstool-ng的下载地址是:http://ymorin.is-a-geek.org/download/crosstool-ng/
   值得注意的是,下载里最新的crosstool-ng以后,记得在到http://ymorin.is-a-geek.org/download/crosstool-ng/01-fixes/ 看看有没有相应的补丁,有得话一起下载下来。

   本次下载的版本是 1.7.0 无 patch。

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

    系统环境为 ubuntu 10.04。===>>>>>> 强列推荐使用ubuntu环境,安装包简单,不需要去单独下载和安装了。apt-get搞定

    必备工且包括:

    1.bison

    2.flex

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

    4.automake

    5.libtool

    7.cvs

    8.patch (ubuntu 10.04可以不装,已是最新版本)

    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

    (12,13,14是后面编译工具链的时候要用)

    不过我是把上面的都装了一遍,保险嘛,呵。

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

 

    其它文章中提到cvsd,gawk,我这里没有提示安装,应该是ubuntu10已民经包含了,省事。

 

    有些像我一样的新手,可能在安装包的过程中会遇到一些权限问题。这里简单说两句,还请高手见谅,不要扔砖。以下只针对ubuntu。redhat不适用。

    由于apt-get是需要权限的,一般可以使用sudo apt-get install xxx 进行安装,在终端里第一次使用时,会提示输入密码。这里就输入本用户的密码就可以。

    要是嫌麻烦(像我一样)不想每次都输入sudo,可以使用指令:

    sudo -sH          ///一定注意大小写

    输入密码,取得用户权限(相当于redhat中su -l指令)

    那么,再执行高权限的命令就都不会有提示了。我后面的安装和编译操作都是在特权模式下进行的,如果有朋友没有编译过去,可以尝试一下在管理员权限下执行make和make install,以及后面的ct-ng build操作。

 

三、安装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}/

    本次要建立的是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"

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

 

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

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

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

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

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

       

        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

         Tune for CPU()   这个搞得我比较晕。对应的GCC描述是这样的:

 

         -mtune=name
           This option is very similar to the -mcpu= option, except that
           instead of specifying the actual target processor type, and hence
           restricting which instructions can be used, it specifies that GCC
           should tune the performance of the code as if the target were of
           the type specified in this option, but still choosing the
           instructions that it will generate based on the cpu specified by a
           -mcpu= option.  For some ARM implementations better performance can
           be obtained by using this option.

           大体意思是说这个选项和 -mcpu 很类似,这里应该指定真实的CPU型号,指定后会对指令集做出一定的限制,但可以优化编译后的性能,翻译出来也是乱乱的。一头雾水。想了想,干脆就空着了。不过有朋友编译2440的工具链,这里选择的是arm9tdmi,我想是不是说如果arm920t处理不了,就用arm9tdmi的方式来编译呢?这就有待高手给解答了。

 

           Floating point() 浮点相关的选项 s3c2410/s3c2440都没有硬件浮点,所以,这里就选software FPU

                                                           s3c6410 有硬件VFP,所以这里选的 hardware FPU

                                                           至于arm920t的处理器选了hardware fpu有什么后果,我没试过,我猜想没什么作用。

                                                                           我感觉这个应该就是给有硬浮点的处理器强行选软浮点用的。

           Use specific FPU() 不懂,不过跟浮点有关,那就不选任何内容了。

 

 

            至于怎么组合,那使用的朋友就跟据自己的CPU相应的进行配置吧。

            其它选项不动

            

            Save an Alternate Configuration File 存盘

            Exit 退出,OK,配置完了。

六、编译工具链

      同样,我是在#权限下做的,如果没有在#权限下,记得指令前加sudo.

       

       ***强调,当前工作目录一定要是 $(build),不是的话一定要进入这目录。

      

       ct-ng build    (没有指定path的情况使用绝对路径,不过会不会出问题,没试过,我是指定情况下试的,反正不废劲,指定一下吧。什么?怎么指定?往前翻)      

       接下来,就是漫长的等待。crosstool-ng会自动下载相应的包,内核文件,然后解压,配置,编译,链接。。。。

       按官网上的说法:have a coffee,have lanuth,take a sleep。。。 我的主机是Q6600四核处理器,3G内存,虚拟机分了1G内存,大约编译了2小时。

 

       最终,我在没有动配置的情况下,在$(HOME)/x-tools中得到了工具链。

       OK,喜欢的话,拷到/usr/local/arm/ ,反正哪里都可以了。

       再加一些链接,工具链就做完了,最后这部分写的有点粗,回头有空再来补一补。

 

 

 

附录:

1:官网上的关于整个过程的建议指令,就这么几行。

./configure --prefix=/some/place
make
make install
export PATH="${PATH}:/some/place/bin"
cd /your/development/directory
ct-ng help
ct-ng menuconfig
ct-ng build

 2:对错误的处理:

   网上很多网友都有,我遇到了再补到这里吧。

 3.补充点废话,最后生成的交叉工具链的名字是arm-unknown-linux-XXXXX这样的一大长串,如果不喜欢那个unknown,修改它的方法是用vi修改.config文件,里面有VENDOR参数,如果为空,生成也是unknown;喜欢的话可以写上自己的名字。

好了,废话终于完了~~~~~呼

没有更多推荐了,返回首页