交叉编译工具链
基于实践的一些粗浅理解,望大拿们不吝校正。
为什么要交叉编译
对于arm或riscv等终端或边缘设备,由于性能较低,难以直接编译较大的工程(非常耗时,以至于无法承受)。通常我们需要在x86服务器上,对这些设备的软件程序进行交叉编译,快速生成目标文件和可执行文件。
下载交叉编译工具链
交叉编译所需要的编译环境,就要用到交叉编译工具链。
由于是在宿主服务器上,编译目标设备系统的目标文件,就需要匹配目标系统内核和编译器,而GCC又依赖于其他的一些库,因此需要一个完整闭环的依赖链,把这些东西做到一起,就是交叉编译工具链。
工具链中给出了对应目标设备系统上匹配的相关工具。可以根据目标设备的芯片类型和系统要求,选择对应的工具链下载包,参考:
https://toolchains.bootlin.com/
怎样选择工具链版本
工具链的架构类型
在目标设备上查看uname -a,确认目标系统的类型,选择对应的工具链类型,比如:
工具链的版本
以aarch64 glibc工具链(https://toolchains.bootlin.com/releases_aarch64.html)为例,我们从下载列表上,可以看到对应的工具链版本中,对应的GCC,GDB,Linux headers,glibc,binutils版本号,这些工具其实就是工具链里主要的东西。所选择的工具链版本,尽可能与目标设备系统的内核版本和编译器版本一致(如果不能精确一致,则选择比目标设备系统编译器版本略低的工具链版本,向后兼容;如果编译器版本选定后,header版本比目标设备系统的内核版本高,则只能要求开发工程内核态程序代码自身做到兼容,否则交叉编译成功的目标文件可能会在目标设备系统上运行时报错。)
比如,使用cat /proc/version查看:
最主要的GCC版本是6.3.0,那么我们要选择的工具链版本,最好对应GCC的版本是6.3.0的就好,GCC所依赖的其他库也将可以一致兼容,而对应GCC为6.3.0的工具链版本,所含linux header的版本都比目标设备系统的内核版本高,则要求开发工程内核态代码的时候进行适配和测试。
工具链里都有啥
工具链里,主要是gcc和gcc依赖的各种库,以形成一个可以交叉编译的闭环依赖环境(除此之外,编译过程不需要其他东西,该有的都有)。下载一个工具链版本并在当前目录解压:
tar -zxvf aarch64--glibc--bleeding-edge.tat.gz
之后,我们进入目录看到工具链目录里包含如下一些文件和内容:
查看READ