运行环境: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..tar.bz2
$ cd linux-2.6.

在指定路径下创建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..tar.gz
$ cd automake-1.11.
$ ./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..tar.gz
$ tar -xjvf gmp-5.0..tar.bz2
$ mv gmp-5.0. ./gcc-4.6./gmp
$ tar -xzvf mpc-0.9.tar.gz
$ mv mpc-0.9 ./gcc-4.6./mpc
$ tar -xzvf mpfr-3.0..tar.gz
$ mv mpfr-3.0. ./gcc-4.6./mpfr
$ cd build-boot-gcc
$ ../gcc-4.6./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./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

如下图:

搞定。

【原创】如何构建MIPS交叉编译工具链的更多相关文章

  1. 构建嵌入式Linux交叉编译工具链

    开源交叉编译工具链制作方法汇总: 1) 使用crosstool/crosstool-ng生成 2) 使用buildroot生成 ARM交叉编译工具链说明: 1) arm-linux-gcc是一个集合命 ...

  2. 交叉编译工具链介绍《Building Embedded Linux Systems》

    1.前言 配置和编译一个合适的GNU工具链是相对复杂的并且需要很精细的操作,包括你需要对不同软件库之间的依赖关系.它们的各自的任务,不同软件库版本情况都有比较好的了解,编译工具链是一个乏味的工作. 2 ...

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

    Crosstool-ng制作交叉编译工具链 交叉编译器可以用现成的,比如CodeSourcery制作的交叉编译器,也可以自己制作,一般是用kernel+gcc+glibc+binutils的源码包来编 ...

  4. 利用Crosstool-ng制作交叉编译工具链

    1.什么是crosstool-ng crosstool-ng,全称是crosstool Next Generation,即下一代crosstool,即crosstool的升级版.那么什么是crosst ...

  5. 使用buildroot创建自己的交叉编译工具链【转】

    本文转载自:https://blog.csdn.net/linczone/article/details/45894181 使用buildroot创建自己的交叉编译工具链 关键字:buildroot ...

  6. Linux ARM交叉编译工具链制作过程【转】

    本文转载自:http://www.cnblogs.com/Charles-Zhang-Blog/archive/2013/02/21/2920999.html 一.下载源文件 源代码文件及其版本与下载 ...

  7. (一)arm交叉编译工具链准备

    1.背景 arm机器一般因为资源问题进行编译会影响开发速度,而且很多时候因为资源不够而无法完成编译工作.因此,需要在执行机上进行交叉编译,即使用x86或其他架构机器基于交叉编译工具编译出在arm上可以 ...

  8. CROSSTOOL-NG建立交叉编译工具链

    CROSSTOOL-NG建立交叉编译工具链 因为考试和学习的原因我已经一段时间没有玩我的JZ2440,现在终于考完试了,我再次找出了我的JZ2440.我之前学习的时候使用的是韦东山老师提供的开发工具, ...

  9. 【转】ARM交叉编译工具链

    原文网址:http://www.veryarm.com/cross-tools 为什么要用交叉编译器? 交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序,比如在PC平台( ...

随机推荐

  1. java编写一个端口扫描器

    好久没写java了,学的时候,也没学习网络编程这一块,无意中看到了一本书,于是小小复习一下java,写个端口扫描器,玩玩吧,网上这种小公具有的是,就是自己无聊写着玩玩. 源代码如下: 共两个类,比较简 ...

  2. iOS--检测野指针

    定位野指针除了使用Malloc Scribble(内存涂鸦)外,还可以使用僵尸对象.所谓的僵尸对象,就是将被释放的对象标记为僵尸,系统不会回收这些对象的内存,并让这些内存无法被重用,因而也就不会被覆写 ...

  3. OC与Swift的区别二(常量、变量、运算符)

    4.常量与变量声明 oc的变量声明使用  类型 变量名 = 变量值的方式,其中类型为系统内置数据类型或自定义类型,变量名需由英文字母开头且不能包含特殊字符 swift变量声明使用 var 变量名 = ...

  4. PHP学习笔记(五)

    关于Response header 的一些小知识: Host :address url,  host 是浏览器给服务器提供的address标识.由于http协议是无状态的,服务器需要根据host的这个 ...

  5. PAT_1046 划拳

    啦啦啦.今天晚上火车回学校了.= =还是挺舍不得家里的. 题目描述: 划拳是古老中国酒文化的一个有趣的组成部分.酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字.如果谁比划出的数字 ...

  6. 九度OJ 1525 子串逆序打印 -- 2012年Google校园招聘笔试题目

    题目地址:http://ac.jobdu.com/problem.php?pid=1525 题目描述: 小明手中有很多字符串卡片,每个字符串中都包含有多个连续的空格,而且这些卡片在印刷的过程中将字符串 ...

  7. 原型模式(Prototype Pattern)

    原型模型:用于创建重复对象,同时保证性能. 这种模式实现一个原型接口,用于创建对象的克隆,当直接创建对象的代价比较大,则可以采用这种模式.例如:一个对象需要高代价的数据库操作之后被创建,这时可以缓存该 ...

  8. SQL Join 的三种类型

    1.Hash Match Join Hash运算(即散列算法) 和Hash表. Hash运算是一种编程技术,用来把数据转换为符号形式,使数据可以更容易更快速地被检索.例如,表中的一行数据,可以通过程序 ...

  9. sonar-maven-plugin问题

    问题: jenkins本地构建时sonar报错 StackOverflow问题 [ERROR] Failed to execute goal org.codehaus.mojo:sonar-maven ...

  10. 禁止选择文本和禁用右键 v3.0

    禁止选中字体(注:在火狐浏览器没有起到效果作用) <script> function disableselect(e) { var omitformtags = ["input& ...