核心概念toolchain
交叉编译工具链
区分 build、host、target、目标三元组、sysroot 与 ABI,避免只凭编译器名称判断兼容性。
**交叉编译工具链(cross-compilation toolchain)**是在一种系统上运行、为另一种目标系统生成程序的一组编译器、汇编器、链接器、库和相关工具。
GNU 配置术语必须分开理解:
| 术语 | 标准含义 |
|---|---|
| build | 构建工具链本身所使用的系统。 |
| host | 构建完成的工具链将要运行的系统。 |
| target | 工具链生成代码所面向的系统。 |
日常使用预编译工具链时,常说的“构建主机”通常是工具链运行所在的 host;它不应与 GNU 配置阶段的 build 概念混为一谈。
四个兼容性层次
Section titled “四个兼容性层次”- 目标系统标识(target tuple):例如
aarch64-linux-gnu或arm-linux-gnueabihf。名称通常编码 CPU、系统和 ABI 信息,但字段数量并非始终固定,应以工具链文档和-dumpmachine为准。 - 指令集架构(ISA):决定处理器能执行哪些机器指令,例如 AArch64 与 32 位 Arm。
- 应用二进制接口(ABI):规定调用约定、寄存器使用、数据布局、目标文件格式等二进制约束。架构相同不代表 ABI 必然兼容。
- sysroot:编译器查找目标系统头文件和库时使用的逻辑根目录。它应与目标用户空间的架构、ABI 和库版本相匹配。
源代码 ↓ 目标编译器、汇编器目标文件 ↓ 目标链接器 + sysroot 中的头文件和库目标 ELF ↓ 匹配的内核、动态加载器和用户空间库在目标设备运行可先检查工具链声明,再检查最终产物:
"$CC" -dumpmachine"$CC" -print-sysrootreadelf -h target-programreadelf -l target-program-dumpmachine 说明编译器的配置目标;readelf 显示实际 ELF。启用多库或额外架构选项后,两者不一定能用一个名称概括,因此最终产物检查不可省略。
- 只看文件名中的
arm或aarch64,不能证明工具链适合目标 Raspberry Pi OS。 - sysroot 是编译和链接视角下的目标目录树,不等同于可直接部署的完整根文件系统。
- 复制目标机
/usr/include并不能自动得到一致的 sysroot;库、动态加载器、符号链接和版本也必须配套。 - ELF 的
Machine字段匹配只证明架构层面正确,不证明动态加载器和库 ABI 已匹配。
- 命令:gcc、make、uname
- 实战:为 Raspberry Pi 交叉编译最小程序