CentOS 7 搭建交叉编译环境(下)



上篇文章已经介绍了Linux交叉编译的基础概念、为什么需要引入交叉编译以及从GCC编译流程的四个步骤出发讲述了搭建交叉编译环境需要构建的一条交叉编译工具链主要有哪些构成的,此外还对当前使用较多的crosstool-ng工具进行了介绍和安装,本篇就具体采用crosstool-ng工具来制作 MIPS64 交叉编译环境(arm也同样适用,只是选择设置有些不一样)。

在制作交叉编译工具链之前,我们需要做两件事:

第一,新建用户,如zhb

[root@localhost ~]# adduser zhb //添加用户
[root@localhost ~]# passwd zhb //设置密码

:不要用root 用户去构建工具链,否则可能会报类似如下错误(一般默认不允许root用户):
在这里插入图片描述
第二:我们先创建一些目录,存放后期制作交叉编译环境,执行如下命令:

[zhb@localhost ~]$ mkdir -p crosstool-23/{build,src,x-tools}

目录结构及说明如下:

[zhb@localhost crosstool-23]$ tree
.
├── build  //专门为后期使用crosstool-ng去建立交叉编译器的编译(build)而专门建立的文件夹对应的,后续的ct-ng menuconfig,ct-ng build等命令,都是在此文件夹下执行的
├── src  //存后续需要下载各种软件的源码包,我们可以先下载好放里面
└── x-tools  //用crosstool-ng所生成的交叉编译器所在的路径

接下来我们就可以开始制作我们的交叉编译工具链,本文将以针对 MIPS 64架构制作交叉交叉编译工具链。

首先,我们可以查看当前版本的有哪些模板样例,执行如下命令:

[zhb@localhost crosstool-23]# ct-ng list-samples  // 该命令查看可用模板,内容比较多,中间就忽略了
Status  Sample name
  LN    config
[G..]   aarch64-rpi3-linux-gnueabi
[G..]   arm-unknown-linux-gnueabi
------省略--------
[G..]   mips64el-multilib-linux-uclibc
[G..]   mipsel-unknown-linux-gnu
------省略--------
[G..]   powerpc-405-linux-gnu
[G..]   powerpc-unknown-linux-gnu
------省略--------
[G.X]   x86_64-w64-mingw32
[G..]   xtensa-fsf-linux-uclibc

注: 这些模板也可以进入/zhb/crosstool-ng-1.23.0/samples 目录(即源码目录)种看到;

本文就选一个最接近的模板mips64el-multilib-linux-uclibc ,然后修改,我们希望用的运行库是glibc 的,也就是最后生成的交叉编译环境是mips64el-zhb-linux-gnu(注:gnu = glibc + oabi)。

第一步:进入目录/home/zhb/crosstool-23/build,执行命令 ct-ng mips64el-multilib-linux-uclibc

第二步:执行命令 ct-ng menuconfig,进入如下界面:
CentOS 7 搭建交叉编译环境(下)_第1张图片

1、选择 Paths and misc options 设定源码包路径和交叉编译工具链的安装路径等;
CentOS 7 搭建交叉编译环境(下)_第2张图片
1)按“空格键”启用Try features marked as EXPERIMENTAL

2)设置src目录,如上${HOME}/crosstool-23/src

3)设置构建工作目录,如上${HOME}/crosstool-23/build

4)设置生成工具链的目录,如上${HOME}/crosstool-23/x-tools

5)设置编译工作线程数量,加快制作速度,上图往下翻,会有选项 Number of parallel jobs ,如设置该数量为8.


2、接着进入到Target options,这里我们选择ABI为n64;
CentOS 7 搭建交叉编译环境(下)_第3张图片

3、进入Toolchain options ,修改 Tuple‘s vendor string 为自己想要的,如zhb(这里是本人姓名简写)
CentOS 7 搭建交叉编译环境(下)_第4张图片

4、接着进入C-library ,修改使用的C运行库为glibc(原来模板是ulibc)
CentOS 7 搭建交叉编译环境(下)_第5张图片

5、进入Companion tools ,启用m4 和make (默认没有选择)
CentOS 7 搭建交叉编译环境(下)_第6张图片

当配置好以后,退出保存即可,在build 目录下面会有个.config 文件(隐藏文件),里面保存的就是上面选择的配置,当然我们也可以通过手动修改该文件去配置生成我们的交叉编译工具链。

第三步:执行如下命令进行工具链的生成:

[zhb@localhost build]$ ct-ng build

:这时如果你之前没有下载相关的源码到${HOME}/crosstool-23/src目录下,那么他会先下载源码到该目录下,如果出现源码自动下载不下来,你可以手动下载好放入${HOME}/crosstool-23/src目录下。我在写这篇文章的时候,就是将所有需要的源码下载好放入${HOME}/crosstool-23/src目录下的。

如果出现如下错误:

[ERROR]    make[1]: *** [Makefile:3687: doc/automake-1.15.1] Error 2

解决方案:进入/home/zhb/crosstools-23/build/src/automake-1.15 目录下,修改Makefile.in 文件,添加 --no-discard-stderr,如下图所示:
在这里插入图片描述

回到/home/zhb/crosstools-23/build目录,继续执行ct-ng build ,如果出现如下错误:

configure: error: C++ compiler not available, see config.log for details

解决方案:安装gcc-c++ ,即执行 yum install gcc-c++.x86_64 安装即可;

继续执行 ct-ng build (本文没有考虑上一步执行情况,其实我们可以继续上一步执行的,有兴趣可以百度~)

出现如下界面,表示交叉编译环境构建成功,可以看到大概花了50分钟左右(当然这还是源代码都已经下载好的情况的,在没有源码的情况下时间会更长);
CentOS 7 搭建交叉编译环境(下)_第7张图片

进入目录/home/zhb/x-tools}/bin,并执行如下看到如下表示OK了在这里插入图片描述
第四步:测试

编译文件testPrint.c,内容如下:

#include 

int main()
{
    printf("hello world!");
    return 0;
}

执行如下命令进行编译(在实际环境中,我们一般会将该命令加入到环境变量中并给其一个“别名”使用):

[root@localhost bin]# ./mips64el-zhb-linux-gnu-gcc testPrint.c -o testPrint

注: 交叉编译的默认搜索头文件路径与普通的gcc不一样,如果想知道的话,可以通过执行如下命令查看,如果编译的时候加入了-nostdinc,则不会到默认路径下去搜索。

echo 'main(){}'| mips64el-zhb-linux-gnu-gcc -E -v - 

编译成功后,通过file查看 testPrint 文件信息:

[root@localhost bin]# file testPrint
testPrint: ELF 64-bit LSB executable, MIPS, MIPS-III version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 4.10.8, with unknown capability 0x756e670000000f41 = 0x304000000070100, not stripped

还可以再通过命令readelf 查看更多详细信息,如下:
CentOS 7 搭建交叉编译环境(下)_第8张图片
可以看出该文件是属于MIPS架构下的一个可执行文件;最后我们在本机(X86机构)上执行一下看看,结果显示不是可以二进制文件,如下所示:

[zhb@localhost bin]$ ./testPrint
bash: ./testPrint: cannot execute binary file

由于我这边暂时没有可用的MISP 64位开发板,也没有模拟机器,所以就没法放到MIPS架构的机器上执行演示了,如果感兴趣可以自己尝试尝试~


好了,到这里我们的MIPS架构的交叉编译器就搭建完成了,谢谢阅读~

你可能感兴趣的:(Linux,知识)