Crosstool-ng制作交叉编译工具链

Crosstool-ng制作交叉编译工具链

交叉编译器可以用现成的,比如CodeSourcery制作的交叉编译器,也可以自己制作,一般是用kernel+gcc+glibc+binutils的源码包来编译安装,后来由于这个太麻烦于是就有类似crosstool这样的自动化配置工具。

现在之所以用crosstool-ng是因为crosstool-ng是新的用来建立交叉工具链的工具,它是crosstool的替换者。crosstool的gcc版本只能到4.1.1,无法编译版本高于2.6.29的linux内核。而crosstool-ng一直保持着更新,现在最新能够建立 gcc 4.3.2版本,可用来编译最新内核。

 

编译的系统环境是:ubuntu 10.04 + crosstool-ng 1.12.0

目标平台:ARMv4t, arm9tdmi,s3c2440

目录

[隐藏]

•       1 配置ubuntu编译环境

•       2 安装crosstool-ng

•       3 配置自己的交叉编译器

•       4 自动下载和编译

•       5 安装交叉编译器和测试

o       5.1安装交叉编译器

o       5.2标准化安装交叉编译器

•       6 更多的配置和提醒

•       7 外部链接

[编辑]配置ubuntu编译环境

安装编译所需的包

 sudoapt-get install sed bash cut dpkg-dev bison flex patch texinfo automake m4libtool stat cvs websvn tar gzip bzip2 lzma readlink libncurses5-dev bison flextexinfo automake libtool patch gcj cvs cvsd gawk -y

安装结束以后就可以用了。

如果后面出现编译错误,再增加相应的包即可

[编辑]安装crosstool-ng

1.      首先从官方网站上下载crosstool-ng的源码包http://crosstool-ng.org/

2. 将此源码包解压缩并编译安装

 tarjxvf crosstool-ng-1.12.0.tar.bz2

 cdcrosstool-ng--1.12.0

 ./configure

 make

 sudomake install

3. 如果一切正常,则ct-ng命令就可以用了

注:编译的时候如果出现错误,可以利用apt-get的方式安装相应的包即可

[编辑]配置自己的交叉编译器

crosstool-ng可以配置各种平台的交叉编译器,也可以构建符合自己实用条件的个性编译器。下面以ARM平台为例,制作具有一定通用性的交叉编译器。这里我们从一个现成的编译器配置开始,用例子里的arm-unknown-linux-gnueabi作为配置的基础,然后来做一个交叉编译器。

将crosstool-ng源码包中samples/arm-unknown-linux-gnueabi/下的crosstool.config拷贝到源码包主目录下,在源码包主目录下执行

cpsamples/arm-unknown-linux-gnueabi/crosstool.config .config

然后执行:

ct-ng menuconfig

进入配置菜单,与linux内核很类似

在这里,我对以下各选项稍作修改

Paths and misc options  --->

    ......

   (${HOME}/src)   Local tarballsdirectory  # 指定制作编译器所需要的源码包的下载存放,可以修改成任意位置,请注意权限。现在指定到~/src下。

   ......

   (/opt/${CT_TARGET}) Prefix directory    # 制作好的编译器所放置的目录

Target options  --->

   Target Architecture (arm)  ---># 注意看这项是不是ARM平台

   ......

   Floating point: (software) ---> # 对于很多ARM架构CPU来说是不支持硬浮点运算的,所以选择软件方式有更好的兼容性

   ......

   [*] Use EABI                           # 是否实用EABI方式,对某些指令采用异常的方式来处理(如除法指令),建议选中

Toolchain options  --->

    .....

    (cjok) Tuple's vendor string  # 这里可以修改成你自己的个性化名称,最后会生成形如arm-yourname-linux-gnueabi这样的编译器前缀

修改好以后就可以开始编译了。

 

[编辑]自动下载和编译

下面就可以开始编译了,默认情况下,源码包会从网络下载,会占用比较大的带宽,下载后总大小在200MB左右,下载好会放到 ~/src下。

开始编译

ct-ng build

经过大概3个小时的下载(2M ADSL小水管)和90分钟的编译过程,在/opt/下生成了arm-cjok-linux-gnueabi目录

注:也可以提前下载好,放到~/src下,但请注意下载的文件名必须一致,否则会重新下载,下面是利用arm-unkown-linux-gnueabi模板生成交叉编译器所需要的源码文件列表

binutils-2.19.1.tar.bz2

dmalloc-5.5.2.tgz

duma_2_5_15.tar.gz

ecj-latest.jar

expat-2.0.1.tar.gz

gcc-4.3.2.tar.bz2

gdb-6.8.tar.bz2

glibc-2.9.tar.bz2

glibc-ports-2.9.tar.bz2

gmp-4.3.2.tar.bz2

libelf-0.8.13.tar.gz

linux-2.6.33.12.tar.bz2

ltrace_0.5.3.orig.tar.gz

mpfr-2.4.2.tar.bz2

ncurses-5.7.tar.gz

strace-4.5.19.tar.bz2

 

[编辑]安装交叉编译器和测试

[编辑]安装交叉编译器

刚制作好的交叉编译器其实就可以用了,但是还有些许不方便之处,我们可以进入到生成好的交叉编译器的目录

cd /opt/arm-cjok-linux-gnueabi/bin

下面执行

./arm-cjok-linux-gnueabi-gcc -v

应该可以看到如下这样的输出信息

root@ubuntu:/home/cjok/cross-tool/ct-done/bin#./arm-cjok-linux-gnueabi-gcc -v

Using built-in specs.

Target: arm-cjok-linux-gnueabi

Configured with:/home/cjok/cross-tool/crosstool-ng-1.12.0/.build/src/gcc-4.3.2/configure--build=i686-build_pc-linux-gnu --host=i686-build_pc-linux-gnu--target=arm-cjok-linux-gnueabi --prefix=/home/cjok/cross-tool/ct-done--with-sysroot=/home/cjok/cross-tool/ct-done/arm-cjok-linux-gnueabi/sysroot--enable-languages=c,c++,fortran,java --disable-multilib --with-float=soft--with-pkgversion='crosstool-NG 1.12.0' --disable-sjlj-exceptions--enable-__cxa_atexit --disable-libmudflap --disable-libgomp --disable-libssp--with-gmp=/home/cjok/cross-tool/crosstool-ng-1.12.0/.build/arm-cjok-linux-gnueabi/build/static--with-mpfr=/home/cjok/cross-tool/crosstool-ng-1.12.0/.build/arm-cjok-linux-gnueabi/build/static--enable-threads=posix --enable-target-optspace--with-local-prefix=/home/cjok/cross-tool/ct-done/arm-cjok-linux-gnueabi/sysroot--disable-nls --enable-c99 --enable-long-long

Thread model: posix

gcc version 4.3.2 (crosstool-NG 1.12.0)

 

这样就表明我们的交叉编译器,制作成功了。

下面把交叉编译器所在的目录添加到系统PATH变量中,修改~/.bashrc文件,在其中添加:

exportPATH=$PATH:/opt/arm-cjok-linux-gnueabi/bin

为了使得这个PATH生效,我们可以执行一下~/.bashrc文件

source ~/.bashrc

这样我们就可以在命令行下直接使用arm-cjok-linux-gnueabi-gcc这样的命令了!

[编辑]标准化安装交叉编译器

我们在使用交叉编译器的时候一般是采用arm-cjok-linux-gnueabi这样的命令的,但是很多标准Makefile需要实用标准的交叉编译器的名称,一般这个名称是arm-linux-gcc这样的。

cd /opt/arm-cjok-linux-gnueabi/bin/

那么我们在生成交叉编译器的目录下写一个link.sh脚本,新建一些软链接。

>link.sh

#!/bin/sh

PREFIX=arm-cjok-linux-gnueabi-

AFTFIX=arm-linux-

ln -s ${PREFIX}gcc ${AFTFIX}gcc

ln -s ${PREFIX}addr2line ${AFTFIX}addr2line

ln -s ${PREFIX}gdbtui ${AFTFIX}gdbtui

ln -s ${PREFIX}ar ${AFTFIX}ar

ln -s ${PREFIX}as ${AFTFIX}as

ln -s ${PREFIX}c++ ${AFTFIX}c++

ln -s ${PREFIX}c++filt ${AFTFIX}c++filt

ln -s ${PREFIX}cpp ${AFTFIX}cpp

ln -s ${PREFIX}g++ ${AFTFIX}g++

ln -s ${PREFIX}gccbug ${AFTFIX}gccbug

ln -s ${PREFIX}gcj ${AFTFIX}gcj

ln -s ${PREFIX}gcov ${AFTFIX}gcov

ln -s ${PREFIX}gdb ${AFTFIX}gdb

ln -s ${PREFIX}gfortran ${AFTFIX}gfortran

ln -s ${PREFIX}gprof ${AFTFIX}gprof

ln -s ${PREFIX}jcf-dump ${AFTFIX}jcf-dump

ln -s ${PREFIX}ld ${AFTFIX}ld

ln -s ${PREFIX}ldd ${AFTFIX}ldd

ln -s ${PREFIX}nm ${AFTFIX}nm

ln -s ${PREFIX}objcopy ${AFTFIX}objcopy

ln -s ${PREFIX}objdump ${AFTFIX}objdump

ln -s ${PREFIX}populate ${AFTFIX}populate

ln -s ${PREFIX}ranlib ${AFTFIX}ranlib

ln -s ${PREFIX}readelf ${AFTFIX}readelf

ln -s ${PREFIX}run ${AFTFIX}run

ln -s ${PREFIX}size ${AFTFIX}size

ln -s ${PREFIX}strings ${AFTFIX}strings

ln -s ${PREFIX}strip ${AFTFIX}strip

写完这个link.sh文件以后,我们可以执行一下

sh link.sh

这样我们就得到了整个使用标准名称的交叉编译工具链,可以在makefile中使用类似arm-linux-gcc这样的名称了。

[编辑]更多的配置和提醒

用ct-ng menuconfig进入配置菜单,可以将某些选项修改成自己的配置,不过注意以下几个地方:

1.      注意其中各个Path的配置必须准确,如果找不到就很麻烦

2.      可以指定不同的下载镜像,但是要确定这个镜像可用并且安全可靠

3.      可以不设置操作系统,也就是可以将Target OS改成bare-metal,这样的交叉编译器适合于面对硬件的裸机程序,如果不改也可以用于裸机编程。

4.      Kernel的版本、库的版本、gcc的版本都不建议修改,除非能够确定一套比较完善的编译源码包的版本组合

5.      配置结束后,建议存一个自己的配置文件,以防万一和错误。

[编辑]外部链接

[1] CodeSourcery网站制作的交叉编译起下载[[1]]

[2] crosstool-ng的官方网站 [[2]]

 

你可能感兴趣的:(ubuntu,工具,fortran,makefile,编译器,linux内核)