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

发布时间:2024-09-13  

一、下载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

  15. gwak  

  16. cvsd

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

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

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

    有些像我一样的新手,可能在安装包的过程中会遇到一些权限问题。这里简单说两句,还请高手见谅,不要扔砖。以下只针对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}/

(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

         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.

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>