如何构建MIPS交叉编译工具链
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何构建MIPS交叉编译工具链相关的知识,希望对你有一定的参考价值。
参考技术A 运行环境:Ubuntu12.04PC提前安装库: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。class="keylink">qqwstewYXV0by10b29sc6Osx9Kw5rG+sdjQ69PruMNtYWtlZmlsZS5pbrDmsb7Su9bCo6xhdXRvbWFrZbDmsb4xLjExLjGjrGF1dG9jb25msOaxvjIuNjShozxiciAvPtDo0qrPyLCy17BhdXRvY29uZqGjPC9wPgoKPHByZSBjbGFzcz0="brush:java;">$ 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
mips-linux-uclibc 编译iperf 工具
mips-linux-uclibc 编译iperf 工具
1 环境说明
硬件环境:君正T30开发板, mips架构
操作系统:ubuntu
交叉编译工具链:mips-linux-uclibc-gnu-gcc-5.4.0、mips-linux-uclibc-gnu-g++
2 编译步骤
2.1 下载 iperf 源码:
官网链接: https://iperf.fr/iperf-download.php
选择 iPerf C++ source ,下载源码,选择版本 Perf 3.1.3 或者其他。
将下载代码放到个人ubuntu 目录,如本人的为:/home/houf/tool/
2.2 解压源码
tar -vxf iperf-3.1.3-source.tar.gz
2.3 创建安装目录
此目录根据个人需要配置为对应的目录(如果不需要单独安装可忽略本步骤),如本人的目录为
/home/houf/tool/iperf-3.1.3/iperf_install
2.4 配置源码包
配置为 mips平台,uclibc 编译工具链,安装目录信息
./configure --host=mips-linux-uclibc CC=mips-linux-uclibc-gnu-gcc-5.4.0 CXX=mips-linux-uclibc-gnu-g++ --prefix=/home/houf/tool/iperf-3.1.3/iperf_install
关于configure 配置参数说明,可参考本人另外一篇博客
https://blog.csdn.net/xhoufei2010/article/details/82768995?spm=1001.2014.3001.5502
2.5 编译
make
2.6 安装
make install
3 编译错误处理
在使用uclibc 编译iperf时候,会提示错误如下:
mips-linux-gnu/bin/ld: cannot find gcrt1.o: No such file or directory
解决方法:
修改src/Makefile.in, 在613 行和 615 行,其中2行,将 -pg 参数删掉
原始代码:
iperf3_profile_CFLAGS = -pg -g
iperf3_profile_LDFLAGS = -pg -g
修改后的代码:
#iperf3_profile_CFLAGS = -pg -g
iperf3_profile_CFLAGS = -g
iperf3_profile_LDADD = libiperf.la
#iperf3_profile_LDFLAGS = -pg -g
iperf3_profile_LDFLAGS = -g
修改之后,make distclean 清除,重新配置编译,编译通过
4 运行测试
编译安装后,生存的文件目录如下:
将各个目录的文件都拷贝到开发板对应的 /usr/ 目录下,最后在开发板上运行 iperf3,实测可以正常运行
以上是关于如何构建MIPS交叉编译工具链的主要内容,如果未能解决你的问题,请参考以下文章