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