您的位置:首页 > 其它

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

2013-12-30 23:23 453 查看
一、下载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:如果出现什么错误可以参照:/article/11170092.html

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

参照这个解决了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: