交叉编译的底层支持
编译,其实有几个过程
前端部分,对源代码进行
后端部分,对中间代码进行
- 优化
- 翻译成汇编 <- 多架构支持 gcc
- 汇编翻译成二进制代码 <- 多架构支持 binutils
- 链接 <- 多架构支持 binutils elf
最终生成可执行程序或者库
那么在标注“多架构支持”的部分,是可以通过 选项参数 进行控制,也就为交叉编译提供了底层支持
什么是交叉编译
交叉编译,简单理解是用A架构编译器,生成B架构应用程序
从编译工具链角度说,它一般指的是:运行在平台架构上,生成这个平台的应用程序的编译器。
如果运行在A平台架构,准备生成B平台架构应用程序,也需要一个编译器,这个编译器叫“交叉编译器”
因为一套完整的编译器由多个组件构成的,所以也叫“交叉编译工具链”
制作交叉编译工具链涉及到三个概念:
build - 本机平台架构,使用的本地平台架构的编译器:需要有一个 native 编译器,运行在原生平台架构上,可以用它编译代码
target - 目标平台架构,指的是交叉编译器编译生成的二进制应用程序的平台架构
host - 运行平台架构,交叉编译器的运行平台架构
例如:原生平台 x86 目标平台 loongarch
如果要编译的代码是gcc 、binutils 、glibc 三件套
那么需要传递三个参数给 构建系统,确定原生编译器是什么,交叉编译器是什么,要生成的目标是什么
build = host = target 表示要本地编译,使用本地编译器,生成本地平台应用
build = host != target 表示要生成一个交叉编译器,交叉编译器运行在 build 平台架构上
build != host = target 表示要生成的编译器,运行在目标平台上,并生成目标平台程序
build = target != host 表示要生成的编译器,在原生平台架构上生成原生平台程序,但运行在 host 平台架构上运行。
build != host != target 这个最复杂,表示在A平台生成的编译器在B平台运行,生成C平台的应用程序
这需要一个条件,是要编译的三件套,要支持 build,host,target 三个平台。
要怎么做?以clfs为例
export CROSS_HOST="x86_64-cross-linux-gnu"
export CROSS_TARGET="loongarch64-unknown-linux-gnu"
以binutils为例:
## 用原生编译器,生成交叉汇编器,原生平台运行,支持目标平台架构
../configure --prefix=${SYSDIR}/cross-tools
--build=${CROSS_HOST}
--host=${CROSS_HOST}
--target=${CROSS_TARGET}
--with-sysroot=${SYSDIR}/sysroot
## 用交叉编译器,交叉编译,生成目标平台架构的汇编器
../configure --prefix=/usr --libdir=/usr/lib64
--build=${CROSS_HOST}
--host=${CROSS_TARGET}
gcc为例:
## 用原生编译器,生成交叉编译器,运行在原生平台,支持目标平台架构
../configure --prefix=${SYSDIR}/cross-tools
--build=${CROSS_HOST}
--host=${CROSS_HOST}
--target=${CROSS_TARGET}
## 用交叉编译器,进行交叉编译,生成目标平台架构的编译器
../configure --prefix=/usr --libdir=/usr/lib64
--build=${CROSS_HOST}
--host=${CROSS_TARGET}
--target=${CROSS_TARGET}