• 【原创】如何构建MIPS交叉编译工具链


    运行环境:Ubuntu12.04
    PC提前安装库:flex,bison,libncureses5-dev,texinfo,这些库提前apt-get install。
    需要重新安装:gawk(先apt-get remove mawk, 然后apt-get install gawk,工具链构建完成后可恢复)。
    交叉编译需要软件包,几乎都可以在GNU下载得到:
    binutils-2.22:GNU的工具包;
    gcc-4.6.2:GCC;
    glibc-2.14:GNU的C库;
    glibc-ports-2.14:GNU的C库的补丁;
    gmp-5.0.4:GNU的数学运算库;
    mpc-0.9:GNU的复数运算库;
    mpfr-3.0.1:GNU的浮点运算库。中mpfr依赖于gmp,mpc依赖于mpfr与gmp;
    linux-2.6.38(用来编译Linux内核以及提供相应头文件)。

    第一步 创建目录以及环境变量
    在当前用户目录下创建target-project文件夹,在该文件夹下创建mips-module文件夹,在mips-module文件夹下创建三个文件夹:build-tools,kernel,tools,最后,在build-tools文件夹下创建build-gcc,build-boot-gcc,build-glibc,build-binutils文件夹。命令如下:

    $ cd ~
    $ mkdir -p ./target-project/mips-module/{kernel/,tools/,build-tools/{build-gcc,build-boot-gcc,build-glibc,build-binutils}}
    $ tree ./target-project/mips-module/

    观察目录结构,如下图:

    使用脚本构建环境变量,脚本内容如下图:

    注意修改/home/用户名,修改正确后,使用source使脚本生效

    $ cd target-project
    $ chmod +x mips.sh
    $ source mips.sh

    可以使用echo査看相关变量名以观察环境变量是否生效。
    最后把linux-2.6.38.tar.bz2下载放置在kernel文件夹下,binutils-2.22.tar.gz,gcc-4.6.2.tar.gz,glibc-2.14.tar.gz,glibc-ports-2.14.tar.gz,gmp-5.0.4.tar.gz,mpc-0.9.tar.gz,mpfr-3.0.1.tar.gz下载放置在build-tools文件夹下。

    第二步 安装基于MIPS的linux头文件

    $ cd $PRJROOT/kernel
    $ tar -xjvf linux-2.6.38.tar.bz2
    $ cd linux-2.6.38

    在指定路径下创建include文件夹,用来存放相关头文件。

    $ mkdir -p $TARGET_PREFIX/include

    保证linux源码是干净的。

    $ make mrproper

    生成需要的头文件。

    $ make ARCH=mips headers_check
    $ make ARCH=mips INSTALL_HDR_PATH=dest headers_install

    将dest文件夹下的所有文件复制到指定的include文件夹内。

    $ cp -rv dest/include/* $TARGET_PREFIX/include

    最后删除dest文件夹

    $ rm -rf dest
    $ ls -l $TARGET_PREFIX/include

    査看生成的include文件夹,如下图:


    第三步 安装binutils-2.22

    $ cd $PRJROOT/build-tools
    $ tar -xzvf binutils-2.22.tar.gz
    $ cd build-binutils
    $ ../binutils-2.22/configure --target=$TARGET --prefix=$PREFIX
    $ make
    $ make install

    我在安装binutils-2.22时会产生这样一个bug,如下图所示:

    错误原因就是-Werror,把warning当成error处理,需要修改相关位置的Makefile文件。而经过察看后,发现binutils都是automake,因此需要重新automake。这里需要安装auto-tools,且版本必须与该makefile.in版本一致,automake版本1.11.1,autoconf版本2.64。
    需要先安装autoconf。

    $ tar -xzvf autoconf-2.64.tar.gz
    $ cd autoconf-2.64
    $ ./configure
    $ make
    $ sudo make install

    再安装automake。

    $ tar -xzvf automake-1.11.1.tar.gz
    $ cd automake-1.11.1
    $ ./configure
    $ make
    $ sudo make install

    下面开始修改相关文件,主要是去掉-Werror。

    $ cd $PRJROOT/build-tools/binutils-2.22/gas
    $ gedit configure

    将下面内容
    # Enable -Werror by default when using gcc
    if test "${GCC}" = yes -a -z "${ERROR_ON_WARNING}" ; then
     ERROR_ON_WARNING=yes
    fi
    修改为
    # Enable -Werror by default when using gcc
    if test "${GCC}" = yes -a -z "${ERROR_ON_WARNING}" ; then
     ERROR_ON_WARNING=no
    fi
    但是,需要重新configure生成Makefile.in。

    $ ./configure           (在binutils/gas路径下的configure)
    $ make distclean        (切记)

    然后重新执行第三步,这次编译可过。
    最后,$ ls $PREFIX/bin,如下图:


    第四步 安装gcc引导器

    $ cd $PRJROOT/build-tools
    $ tar -xzvf gcc-4.6.2.tar.gz
    $ tar -xjvf gmp-5.0.4.tar.bz2
    $ mv gmp-5.0.4 ./gcc-4.6.2/gmp
    $ tar -xzvf mpc-0.9.tar.gz
    $ mv mpc-0.9 ./gcc-4.6.2/mpc
    $ tar -xzvf mpfr-3.0.1.tar.gz
    $ mv mpfr-3.0.1 ./gcc-4.6.2/mpfr
    $ cd build-boot-gcc
    $ ../gcc-4.6.2/configure --target=$TARGET --prefix=$PREFIX --disable-shared 
    --without-headers --with-newlib --enable-languages=c --disable-decimal-float
    --disable-libgomp --disable-libmudflap --disable-libssp --disable-threads --disable-multilib

    编译并安装gcc引导器、libgcc库。

    $ make all-gcc
    $ make all-target-libgcc
    $ make install-gcc
    $ make install-target-libgcc


    第五步 编译glibc

    $ cd $PRJROOT/build-tools
    $ tar xzvf glibc-2.14.tar.gz
    $ cd glibc-2.14

    删除Makefonfig文件中的内容-lgcc_eh。

    $ cp -v Makeconfig{,.bk}
    $ sed -e 's/-lgcc_eh//g' Makeconfig.bk > Makeconfig
    $ cd ..
    $  tar -xjvf glibc-ports-2.14.tar.bz2
    $ mv glibc-ports-2.14 ./glibc-2.14/ports
    $ cd build-glibc
    $ CC=mipsel-linux-gcc ../glibc-2.14/configure --host=$TARGET --prefix="/usr" 
    --enable-add-ons --with-headers=$TARGET_PREFIX/include libc_cv_forced_unwind=yes
    libc_cv_c_cleanup=yes

    注意:此时如何设置了LD_LIBRARY_PATH环境变量会configure error,需要删除该变量重新configure。

    $ make
    $ make install_root=$TARGET_PREFIX prefix=‘’ install

    第六步 完全安装gcc
    首先,也是很重要的是去掉libc等库文件的绝对路径。

    $ cd $TARGET_PREFIX/lib

    备份一下。

    $ cp libc.so libc.so.bk
    $ gedit libc.so

    将原内容
    GROUP ( /lib/libc.so.6 /lib/libc_nonshared.a  AS_NEEDED ( /lib/ld.so.1 ) )
    修改为
    GROUP ( libc.so.6 libc_nonshared.a  AS_NEEDED ( ld.so.1 ) )

    $ cp libpthread.so libpthread.so.bk
    $ gedit libpthread.so

    将原内容
    GROUP ( /lib/libpthread.so.0 /lib/libpthread_nonshared.a )
    修改为
    GROUP ( libpthread.so.0 libpthread_nonshared.a )
    然后可以完全编译gcc。

    $ cd $PRJROOT/build-tools/build-gcc
    $ ../gcc-4.6.2/configure --target=$TARGET --prefix=$PREFIX --enable-languages=c,c++
    $ make all
    $ make install

    注意,编译或者在qemu仿真的时候一定要指定相关库文件的路径。
    完全安装gcc,$ ls $PREFIX/bin,如下图:

    编译任意C文件。

    $ mipsel-linux-gcc -o test test.c (注意需要设置环境变量或者source mips.sh)
    $ file test

    如下图:

    搞定。

  • 相关阅读:
    Git:常用命令记录
    JS笔记(二):隐式转换
    vertical-align/line-height:水平垂直居中
    JS笔记(一):声明提升
    Array.prototype.sort():从一道面试题说起
    CSS笔记(一):选择器规范
    FreeCodeCamp:Profile Lookup
    tile_images_offset的简单使用
    vs2013快捷键等(转)
    Qt状态栏的使用(转)
  • 原文地址:https://www.cnblogs.com/bombe1013/p/3718420.html
Copyright © 2020-2023  润新知