zoukankan      html  css  js  c++  java
  • 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.10 + crosstool-ng 1.11.1
    目标平台:ARMv4t, arm9tdmi,s3c2440

    目录

    [隐藏]

    [编辑]配置ubuntu编译环境

    安装编译所需的包

     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
    

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

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

    [编辑]安装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作为配置的基础,然后来做一个交叉编译器。

    将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下。

    开始编译

    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. 配置结束后,建议存一个自己的配置文件,以防万一和错误。
  • 相关阅读:
    hiveserver2 with kerberos authentication
    python Basic usage
    python Quicksort demo
    Python HeapSort
    mrunit for wordcount demo
    CCDH证书
    Hadoop question list
    Hadoop Yarn core concepts
    Hadoop Resource
    Hadoop could not find or load main class
  • 原文地址:https://www.cnblogs.com/Charles-Zhang-Blog/p/3319377.html
Copyright © 2011-2022 走看看