zoukankan      html  css  js  c++  java
  • 使用Crosstool 0.43 在ubuntu0.94上制作arm交叉编译器armlinuxgcc .

    一。 保证ubuntu 上安装如下软件包

    Bison
    flex
    build-essential
    patch
    libncurses5-dev

    查看该软件包的依赖关系,可以看到以下内容:

    $ apt-cache depends build-essential

    安装软件包使用 $sudo apt-get install 软件包名

    二。 Crosstool

    Crosstool 是一组脚本工具集,可构建和测试不同版本的gcc和glibc,用于那些支持glibc的体系结构。它也是一个开源项目,下载地址是http: //kegel.com/crosstool。用Crosstool构建交叉工具链要比分步编译容易得多,并且也方便许多,对于仅仅为了工作需要构建交叉编译工具链的读者建议使用此方法。用Crosstool工具构建所需资源下所示。

    表2.2  所需资源

    安装包
     下载地址
     
    crosstool-0.43.tar.gz
     http://kegel.com/crosstool
     
    linux-2.6.15.4.tar.gz
     ftp.kernel.org
     
    binutils-2.16.1.tar.bz2
     ftp.gnu.org
     
    gcc-3.3.6.tar.gz
     ftp.gnu.org

    gcc-4.1.tar.gz
     ftp.gnu.org 
     
    glibc-2.3.2.tar.gz
     ftp.gnu.org
     
    glibc-linuxthreads-2.3.2.tar.gz
     ftp.gnu.org
     
    linux-libc-headers-2.6.12.0.tar.bz2
     ftp.gnu.org
     

    gdb6.5.tar.bz2

    三。crosstoo 安装基本步骤

    1.准备资源文件

    首先从网上下载所需资源文件,然后将这些工具包文件放在新建的$HOME/downloads目录下,最后在$HOME/downloads目录下解压crosstool-0.43.tar.gz,命令如下:

    # cd /home/zhoug/downloads(注$HOME = /home/zhoug)

    # tar –xzvf crosstool-0.42.tar.gz

    (

    对于tar.bz2的文件,其解压命令

    #tar -xjvf xxx.tar.bz2

    )

    2.建立脚本文件

    # cd HOME/downloads/crosstool0.43

    # cp demo-arm9tdmi.sh arm.sh

    # sudo gedit arm.sh

    #!/bin/sh
    # This script has one line for each known working toolchain
    # for this architecture.  Uncomment the one you want.
    # Generated by generate-demo.pl from buildlogs/all.dats.txt

    set -ex
    TARBALLS_DIR=$HOME/downloads   #资源下载目录
    RESULT_TOP=/opt/crosstool             #编译工具最终生成目录
    export TARBALLS_DIR RESULT_TOP
    GCC_LANGUAGES="c,c++"                 # 定义支持C, C++语言
    export GCC_LANGUAGES

    # Really, you should do the mkdir before running this,
    # and chown /opt/crosstool to yourself so you don't need to run as root.
    mkdir -p $RESULT_TOP

    #eval `cat arm9tdmi.dat gcc-3.2.3-glibc-2.2.5.dat` sh all.sh --notest
    #eval `cat arm9tdmi.dat gcc-3.2.3-glibc-2.3.2.dat` sh all.sh --notest
    #eval `cat arm9tdmi.dat gcc-3.2.3-glibc-2.3.2-tls.dat` sh all.sh --notest
    #eval `cat arm9tdmi.dat gcc-3.3.6-glibc-2.2.5.dat` sh all.sh --notest
    #eval `cat arm9tdmi.dat gcc-3.3.6-glibc-2.3.2.dat` sh all.sh --notest
    #eval `cat arm9tdmi.dat gcc-3.3.6-glibc-2.3.2-tls.dat` sh all.sh --notest
    #eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.2.5.dat` sh all.sh --notest
    #eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.2.dat` sh all.sh --notest
    #eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.2-tls.dat` sh all.sh --notest
    #eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.5.dat` sh all.sh --notest
    #eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.5-tls.dat` sh all.sh --notest
    #eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.6.dat` sh all.sh --notest
    #eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.6-tls.dat` sh all.sh --notest
    #eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.2.dat` sh all.sh --notest
    #eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.2-tls.dat` sh all.sh --notest
    #eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.5.dat` sh all.sh --notest
    #eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.5-tls.dat` sh all.sh --notest
    #eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.6.dat` sh all.sh --notest
    #eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.6-tls.dat` sh all.sh --notest
    #eval `cat arm9tdmi.dat gcc-4.1.0-glibc-2.3.2.dat` sh all.sh --notest
    eval `cat arm9tdmi.dat gcc-4.1.0-glibc-2.3.2-tls.dat` sh all.sh --notest --nounpack


    echo Done

    3..建立配置文件 

    # gedit arm9tdmi .dat

    ----------------------------------------------------------------------------------------------------------

    KERNELCONFIG=`pwd`/arm.config
    TARGET=arm-linux    # 编译生成的工具链名称
    GCC_EXTRA_CONFIG="--with-cpu=arm9tdmi --enable-cxx-flags=-mcpu=arm9tdmi"
    TARGET_CFLAGS="-O"

    ----------------------------------------------------------------------------------------------------------

    # gedit gcc-4.1.0-glibc-2.3.2-tls.dat

    BINUTILS_DIR=binutils-2.16.1
    GCC_CORE_DIR=gcc-3.3.6
    GCC_DIR=gcc-4.1.0
    GLIBC_DIR=glibc-2.3.2
    LINUX_DIR=linux-2.6.15.4
    LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
    GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2
    GDB_DIR=gdb-6.5
    GLIBC_EXTRA_CONFIG="$GLIBC_EXTRA_CONFIG --with-tls --with-__thread  --enable-kernel=2.4.18"

    ----------------------------------------------------------------------------------------------------------

    4.执行脚本

    将Crosstool的脚本文件和配置文件准备好之后,开始执行arm.sh脚本来编译交叉编译工具。具体执行命令如下:

    # cd crosstool-0.43

    # ./arm.sh 

    5.设置环境变量

    # sudo gedit /etc/bash.bashrc

    export PATH=$PATH:/opt/crosstool/gcc-4.1.0-glibc-2.3.2/arm-linux/bin:

    四。编译中出现的错误

    1. 我机器上的gcc 版本是gcc 4.3.3 ,进行编译时出错。

       gcc 版本高或低,sudo apt-get remove gcc ,sudo apt-get install gcc-4.1 。由于ubuntu 可以安装多种版本的gcc.我只执行

       sudo apt-get install gcc-4.1。

       安装gcc-4.1后

       sudo rm /usr/bin/gcc            (删除GCC,它只是个到gcc-4.3.2的软连接文件)
       sudo ln -s /usr/bin/gcc-4.1 /usr/bin/gcc        (建立GCC到gcc-4.1的软连接)

    2. 错误如下:

    make[2]: *** [/home/zhoug/downloads/crosstool-0.43/build/arm-linux/gcc-4.1.0-glibc-2.3.2/build-glibc/csu/version.o] 错误 1
    bash: make[2]::找不到命令
    make[2]:正在离开目录 `/home/zhoug/downloads/crosstool-0.43/build/arm-linux/gcc-4.1.0-glibc-2.3.2/glibc-2.3.2/csu'
    make[1]: *** [csu/subdir_lib] 错误 2
    make[1]:正在离开目录 `/home/zhoug/downloads/crosstool-0.43/build/arm-linux/gcc-4.1.0-glibc

    解决方法:

    修改如下文件:
    gedit /crosstool0.43/build/arm-linux/gcc-4.1.0-glibc-2.3.2/build-glibc/csu/version-info.h
    "Available extensions:/n"
    "/n"
    vim Demo-arm.sh
    在工具链版本后加 --notest --nounpack

    3.网上介绍的其他错误

    1)《安装gcc后》安装了gcc-4.1之后,重新编译。心想这回好了吧?!不想,有出了以下错误:
    In file included from version.c:33:
    /home/tekkaman/working/crosstool-0.43/build/arm-9tdmi-linux-gnu/gcc-4.1.1-glibc-2.3.2/build-glibc/csu/version-info.h:2:1: missing terminating " character
    /home/tekkaman/working/crosstool-0.43/build/arm-9tdmi-linux-gnu/gcc-4.1.1-glibc-2.3.2/build-glibc/csu/version-info.h:3:1: missing terminating " character
    google后发现,原来是ubuntu将系统默认的shell设置成了dash (the Debian Almquist Shell),所以通过脚本生成的文件格式和bash的不一样,导致了编译错误。在使用了
    ursa
    的方法后问题解决。
    sudo mv /bin/sh /bin/sh.old
    sudo ln -sf bash /bin/sh

    2)今天在编译skyeye时又报错
    /usr/include/bits/fcntl2.h:51: 错误: 调用‘__open_missing_mode’,声明有错误属性:open with O_CREAT in second argument needs 3 arguments
    按理说在Fedora 10中都可以编译过的,在ubuntu下应该也没什么问题才对,可是偏偏出现这个问题。赶紧跟踪,首先对比两个版本的/usr/include/bits/fcntl2.h,发现没有区别,那么就是代码的问题了。改代码,报错是在612行
    if(!nf->writebuffer)
    free(nf->writebuffer);
    free(nf);
    提示是open有错,但是612行是free,注释掉前两行,居然误报成了free(nf),继续注释掉free(nf),终于,错误给出来了,是在519行的 if ((nf->fdump= open(dev->dump, FILE_FLAG)) 0)
    open在调用的时候只有两个参数,赶紧给加上个0777,代码成了 if ((nf->fdump= open(dev->dump, FILE_FLAG,0777)) 0)
    谢天谢地,终于编译通过了。

    遇到arm-linux-ar堆栈溢出的问题

    主要是4.3.2编译器的问题,改为4.1的编译器即可

  • 相关阅读:
    perl学习之路3
    perl学习之路1
    年少的忧伤
    莎士比亚的情诗
    自做贪吃蛇游戏的android实现
    伤感的蝴蝶
    爱上下拉列表框Spinner
    相识RadioGroup初恋CheckBox
    EditText和Button的纠缠
    谁陪我一起打包Andriod应用
  • 原文地址:https://www.cnblogs.com/zhoug2020/p/2430084.html
Copyright © 2011-2022 走看看