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

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

交叉编译器能够用现成的,好比CodeSourcery制做的交叉编译器,也能够本身制做,通常是用kernel+gcc+glibc+binutils的源码包来编译安装,后来因为这个太麻烦因而就有相似crosstool这样的自动化配置工具。php

如今之因此用crosstool-ng是由于crosstool-ng是新的用来创建交叉工具链的工具,它是crosstool的替换者。crosstool的gcc版本只能到4.1.1,没法编译版本高于2.6.29的linux内核。而crosstool-ng一直保持着更新,如今最新可以创建 gcc 4.3.2版本,可用来编译最新内核。java

编译的系统环境是:ubuntu 10.10 + crosstool-ng 1.11.1
目标平台:ARMv4t, arm9tdmi,s3c2440

目录

[隐藏]

[编辑]配置ubuntu编译环境

安装编译所需的包linux

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

安装结束之后就能够用了。c++

若是后面出现编译错误,再增长相应的包便可web

[编辑]安装crosstool-ng

1. 首先从官方网站上下载crosstool-ng的源码包  http://ymorin.is-a-geek.org/download/crosstool-ng/crosstool-ng-1.11.1.tar.bz2
** 记得在到http://ymorin.is-a-geek.org/download/crosstool-ng/01-fixes/ 看看有没有相应的补丁,有得话一块儿下载下来。(#patch -p1 < 补丁文件      //若是有补丁,打补丁)
2. 将此源码包解压缩并编译安装
 tar jxvf crosstool-ng-1.11.1.tar.bz2
 cd crosstool-ng--1.11.1
 ./configure
 make
 sudo make install
3. 若是一切正常,则ct-ng命令就能够用了

注:编译的时候若是出现错误,能够利用apt-get的方式安装相应的包便可编程

[编辑]配置本身的交叉编译器

crosstool-ng能够配置各类平台的交叉编译器,也能够构建符合本身实用条件的个性编译器。下面以ARM平台为例,制做具备必定通用性的交叉编译器。这里咱们从一个现成的编译器配置开始,用例子里的arm-unknown-linux-gnueabi做为配置的基础,而后来作一个交叉编译器。ubuntu

将crosstool-ng源码包中samples/arm-unknown-linux-gnueabi/下的crosstool.config拷贝到源码包主目录下,在源码包主目录下执行
cp samples/arm-unknown-linux-gnueabi/crosstool.config .config
而后执行:
ct-ng menuconfig
进入配置菜单,与linux内核很相似
在这里,我对如下各选项稍做修改
Paths and misc options  ---> 
    ......
    (${HOME}/src)   Local tarballs directory  # 指定制做编译器所须要的源码包的下载存放,能够修改为任意位置,请注意权限。如今指定到~/src下。
    ......
    (/opt/${CT_TARGET}) Prefix directory     # 制做好的编译器所放置的目录
Target options  --->
    Target Architecture (arm)  ---> # 注意看这项是否是ARM平台
    ......
    Floating point: (software)  ---> # 对于不少ARM架构CPU来讲是不支持硬浮点运算的,因此选择软件方式有更好的兼容性
    ......
    [*] Use EABI                            # 是否实用EABI方式,对某些指令采用异常的方式来处理(如除法指令),建议选中
Toolchain options  --->
     ..... 
     (tonghuix) Tuple's vendor string  # 这里能够修改为你本身的个性化名称,最后会生成形如arm-yourname-linux-gnueabi这样的编译器前缀
修改好之后就能够开始编译了。

[编辑]自动下载和编译

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

开始编译bash

ct-ng build

通过大概3个小时的下载(2M ADSL小水管)和90分钟的编译过程,在/opt/下生成了arm-tonghuix-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-tonghuix-linux-gnueabi/bin

下面执行

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

应该能够看到以下这样的输出信息

Target: arm-tonghuix-linux-gnueabi
Configured with: /home/tonghuix/crosstool-ng-1.11.1/.build/src/gcc-4.3.2/configure --build=i686-build_pc-linux-gnu --host=i686-build_pc
 inux-gnu --target=arm-tonghuix-linux-gnueabi --prefix=/opt/arm-tonghuix-linux-gnueabi --with-sysroot=/opt/arm-tonghuix-linux-gnueabi-
 arm-tonghuix-linux-gnueabi/sysroot --enable-languages=c,c++,fortran,java --disable-multilib --with-float=soft --with-pkgversion=crosstool-  
 NG-1.11.1 --disable-sjlj-exceptions --enable-__cxa_atexit --disable-libmudflap --disable-libgomp --disable-libssp --with-gmp=/home/tonghuix
 /crosstool-ng-1.11.1/.build/arm-tonghuix-linux-gnueabi/build/static --with-mpfr=/home/tonghuix/crosstool-ng-1.11.1/.build/arm-tonghuix-
 linux-gnueabi/build/static --enable-threads=posix --enable-target-optspace --with-local-prefix=/opt/arm-tonghuix-linux-gnueabi-
 arm-tonghuix-linux-gnueabi/sysroot --disable-nls --enable-symvers=gnu --enable-c99 --enable-long-long
Thread model: posix
gcc version 4.3.2 (crosstool-NG-1.11.1) 

这样就代表咱们的交叉编译器,制做成功了。

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

export PATH=$PATH:/opt/arm-tonghuix-linux-gnueabi/bin

为了使得这个PATH生效,咱们能够执行一下~/.bashrc文件

source ~/.bashrc

这样咱们就能够在命令行下直接使用arm-tonghuix-linux-gnueabi-gcc这样的命令了!

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

咱们在使用交叉编译器的时候通常是采用arm-tonghuix-linux-gnueabi这样的命令的,可是不少标准Makefile须要实用标准的交叉编译器的名称,通常这个名称是arm-linux-gcc这样的。

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

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

>link.sh

#!/bin/sh
PREFIX=arm-tonghuix-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. 配置结束后,建议存一个本身的配置文件,以防万一和错误。
相关文章
相关标签/搜索