交叉编译工具链是一种用于在一个平台上编译另一个平台上运行的程序的软件工具集,它通常包括编译器、链接器、汇编器等组件。
交叉编译工具链的命名一般遵循 target-platform-triplet 的格式,例如 arm-linux-gcc 表示用于生成 ARM 平台上 Linux 系统下运行的程序的 GCC 编译器¹。
根据我搜索到的信息,目前主流的交叉编译工具链有以下几种:
- Linaro 提供的 ARM 交叉编译工具链,可以到 Linaro 官网 Linaro Releases 去下载已经制作好的交叉编译工具链¹。
- yagarto 提供的 ARM 交叉编译工具链,可以到 yagarto 官网 Yet another GNU ARM toolchain 去下载已经制作好的交叉编译工具链¹。
- crosstool-ng 是一个用于构建自定义交叉编译工具链的工具,它可以支持多种目标平台和配置选项,可以到 crosstool-ng 官网 crosstool-ng 去下载源码并按照文档进行安装和使用²。
- buildroot 是一个用于构建嵌入式 Linux 系统的工具,它可以自动下载、配置、编译和安装交叉编译工具链、内核、根文件系统等组件,可以到 buildroot 官网 Buildroot 去下载源码并按照文档进行安装和使用³。
你可以根据你的需求和喜好选择合适的交叉编译工具链,并按照相应的教程进行获取和安装。希望这些信息对你有帮助。😊
(1) 常用的交叉编译工具链 - 知乎 - 知乎专栏. https://zhuanlan.zhihu.com/p/38023312.
(2) 交叉编译工具链(详解) - insistYuan - 博客园. https://www.cnblogs.com/coolYuan/p/9037660.html.
(3) 选择交叉编译链 - 简书. https://www.jianshu.com/p/fe5485a8dae7.
(4) Ubuntu 下搭建 GCC 交叉编译工具链 - 知乎 - 知乎专栏. https://zhuanlan.zhihu.com/p/563907000.
(5) 编译工具链 - 知乎 - 知乎专栏. https://zhuanlan.zhihu.com/p/110402378.
- 编译器(compiler),用于将源代码转换为目标平台的机器码,如gcc、g++等。
- 汇编器(assembler),用于将汇编代码转换为目标平台的机器码,如as等。
- 链接器(linker),用于将多个目标文件链接为一个可执行文件,如ld等。
- 解释器(interpreter),用于在目标平台上执行可执行文件,如gdb等。
- 库(library),用于提供一些基本的函数和数据结构,如glibc、libstdc++等。
交叉编译工具链的功能是为了编译跨平台体系结构的程序代码而形成的一套完整的工具集,它可以使开发者在一个平台上开发和测试另一个平台上运行的程序2。
交叉编译工具链的使用方法一般是:
- 下载或者自己构建适合目标平台的交叉编译工具链,并设置好环境变量,如PATH、LD_LIBRARY_PATH等。
- 使用交叉编译器编译源代码,生成目标文件,如arm-linux-gnueabihf-gcc hello.c -o hello.o
- 使用交叉链接器链接目标文件,生成可执行文件,如arm-linux-gnueabihf-ld hello.o -o hello
- 将可执行文件拷贝到目标平台上运行,或者使用交叉解释器在本地模拟运行,如arm-linux-gnueabihf-gdb hello
根据我的搜索结果,gcvo和dump文件是交叉编译工具链中的一些辅助文件,有以下作用:
- gcvo文件是用于代码覆盖率分析的文件,它记录了源代码中每个基本块的执行次数,可以用于评估测试的质量和完整性1。
- dump文件是用于程序调试的文件,它保存了程序在某个时刻的内存镜像,可以用于分析程序的运行状态和异常原因。
这些文件的使用方法一般是:
- gcvo文件需要在编译时加上 -fprofile-arcs 选项,生成对应的gcno文件,然后在运行时加上 -ftest-coverage 选项,生成对应的gcda文件,最后使用gcov工具分析这些文件,生成覆盖率报告1。
- dump文件需要在程序运行时发生异常或崩溃时自动生成,或者使用一些工具如gdb、procdump等手动生成,然后使用相应的调试器如gdb、windbg等打开这些文件,进行调试和分析 。
常用的交叉编译工具链
编译新版本的 U-boot和 Linux 内核需要选择比较新的 ARM 交叉编译工具链,如果使用的叉编译工具链版本比较低可能会导致编译不通过。
这里要注意的一点是要根据虚拟机里Ubuntu 系统的位数来选择 64 位的交叉编译器工具链还是 32 位的交叉编译工具链。
1、Linaro 提供的 ARM 交叉编译工具链,可以到 Linaro 官网Linaro Releases去下载已经制作好的交叉编译工具链。
2.yagarto提供的 ARM 交叉编译工具链,可以到 yagarto 官网Yet another GNU ARM toolchain去下载已经制作好的交叉编译工具链。
以Linaro为例:
(1)首先在 Ubuntu 系统中安装相关的标准 C 开发环境库
在 Ubuntu 系统终端执行命令: $ sudo apt-get install gcc g++ libgcc1 libg++ make gdb
(2)完成相关库的安装。安装好相关库后,在/usr/local/目录下新建名为 ARM-toolchain的文件夹用于存放交叉编译工具链。接下来就是下载交叉编译工具链,相关命令如下:
$ cd /usr/local/ARM-toolchain
$ sudo wget http://releases.linaro.org/components/toolchain/binaries/6.1-2016.08/ar-m-linux-gnueabi/gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-gnueabi.tar.xz
$ xz -d gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-gnueabi.tar.xz
$ tar xvf gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-gnueabi.tar
(3)接下来需要把交叉编译工具链的路径添加到 Ubuntu 系统的环境变量中去。在/etc/bash.bashrc 文件中添加如下内容:
# Add ARM toolschain path
if[ -d/usr/local/ARM-toolchain/gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-gnueabi
] ; then
PATH=/usr/local/ARM-toolchain/gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-gnuea
bi/bin:"${PATH}"
fi
然后执行 source /etc/bash.bashrc 命令使新的环境变量生效。
(4)安装完成后,我们可以在终端执行 arm-linux-gnueabi-gcc –v 命令来查看交叉编
译工具链的版本信息,如下图所示:
图 1 交叉工具链版本信息
Ubuntu 下搭建 GCC 交叉编译工具链 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/563907000
1. 交叉编译工具链介绍
1.1 交叉编译
本地编译:在当前目标平台下,编译出来的程序,放到当前平台下,就可以运行
交叉编译:在一种平台上编译,编译出来的程序,放到别的平台上运行(编译和运行环境不一样,属于交叉的)
交叉编译是一个和本地编译,相对应的概念。主要和嵌入式开发有关,由于嵌入式系统中的各种资源相对有限,只够嵌入式系统运行的,没太多剩余的资源,所以很难进行直接的本地编译
1.2 交叉编译工具链
编译过程是按照不同的子功能,依照先后顺序组成的一个复杂的流程,如下图:
编译过程包括了预处理、编译、汇编、链接等功能。每个子功能都是一个单独的工具来实现,它们合在一起形成了一个完整的工具集。同时编译过程又是一个有先后顺序的流程,牵涉到工具的使用顺序,每个工具按照先后关系串联在一起,形成了一个编译工具链
交叉编译工具链就是为了编译跨平台体系结构的程序代码而形成的由多个子工具构成的一套完整的工具集。同时它隐藏了预处理、编译、汇编、链接等细节,当指定了源文件(.c)时,它会自动按照编译流程调用不同的子工具,自动生成最终的二进制程序映像(.bin)
注意:严格意义上来说,交叉编译器,只是指交叉编译的gcc,但是实际上为了方便,我们常说的交叉编译器就是交叉编译工具链
1.3 交叉编译工具链命名规则
在使用交叉编译链时,常常会看到下面这样的名字:
arm-linux-gnueabihf-
arm-none-linux-gnueabi-
arm-cortex_a8-linux-gnueabi-
mips-malta-linux-gnu-
这些交叉编译链的命名通常会遵循一定的规则:arch-vender-os-abi
,各字段说明如下:
- arch:目标cpu架构,比如mips、arm、x86、riscv等,该字段通常不会省略
- vendor:提供此编译工具链的厂商名称或是厂商特定信息,该字段只是标识信息,没有实际意义,可以为none、cross、unknow或是直接省略
- os:目标设备上运行的操作系统,常见的有linux、none(裸机)等
- abi:应用程序二进制接口(Application Binary Interface),交叉编译链所选择的库函数和目标映像的规范,该字段常见的值有abi 、eabi(embedded abi)、gun(glibc+oabi)、gnueabi(glibc+eabi)、gnueabihf (hf 指默认编译参数支持硬件浮点功能)等
2. Ubuntu下搭建GCC交叉编译工具链
Ubuntu自带的gcc编译器是针对X86架构的,但是我们要编译的是ARM架构的代码,所以需要一个在X86架构PC上运行,可以编译ARM架构代码的交叉编译器
2.1 下载交叉编译器
本文使用Linaro出品的交叉编译器, Linaro是一间非营利开放源代码软件工程公司,最著名的就是Linaro GCC编译工具链(编译器),其官网可以下载源码
Linaro 网站提供了多种GCC交叉编译工具链,我们使用的是Cortex-A7内核的开发板,因此选择arm-linux-gnueabihf,再根据32/64位系统下载不同版本的编译器,这里选择下载x86_64版本
2.2 安装交叉编译器
⏩ 在Ubuntu中创建目录/usr/local/arm
sudo mkdir /usr/local/arm
⏩ 将下载好的交叉编译器复制到该目录中
sudo cp gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz /usr/local/arm/ -f
⏩ 拷贝完成后在该目录中对交叉编译工具进行解压
sudo tar -vxf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz
⏩ 打开/etc/profile文件,修改环境变量,在文件末尾添加如下内容
export PATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin
⏩ 使用交叉编译器,还需要安装如下库
sudo apt-get install lsb-core lib32stdc++6
2.3 交叉编译器验证
使用以下命令查看交叉编译工具的版本号,若安装正确就会显示版本号
arm-linux-gnueabihf-gcc -v
从上图可以看出当前交叉编译器的版本号为4.9.4,说明交叉编译工具链安装成功。使用交叉编译器的命令一般是arm-linux-gnueabihf-gcc