Rust `*-oe-linux-gnu` 目标详解:为 OpenEmbedded/Yocto 构建系统交叉编译 Rust
Rust*-oe-linux-gnu目标详解为 OpenEmbedded/Yocto 构建系统交叉编译 Rust【免费下载链接】rustEmpowering everyone to build reliable and efficient software.项目地址: https://gitcode.com/GitHub_Trending/ru/rust本文基于 Rust 官方平台支持文档 oe-linux-gnu.md系统讲解*-oe-linux-gnu系列 Tier 3 交叉编译目标的适用场景、构建要求与使用方式并结合 rustc_target 中的目标定义源码说明每个 triplet 背后的元数据、默认链接器设置及其与标准 Linux glibc 目标的继承关系帮助你为 Yocto 系统定制 Rust 构建环境。1. 什么是*-oe-linux-gnu目标*-oe-linux-gnu是 rustc 中面向OpenEmbedded 与 Yocto Project 构建系统生成的 Linux 系统的一组交叉编译目标。这类目标服务于嵌入式与系统软件领域常见的 Yocto 工作流在构建机上通过 OpenEmbedded 交叉工具链为特定硬件平台x86_64、aarch64、i686、armv7、riscv64生成 Linux 可执行文件。官方文档将其 Tier 级别标记为Tier 3这意味着这些目标不由上游 Rust CI 主动保证测试通过需要目标维护者或社区自行验证Rust不发布这些目标的预编译工具链或标准库制品Rust does not currently ship precompiled artifacts for these targets它们的设计定位是作为基础目标定义base target definitions供下游 Yocto 生成的目标从这些基础定义继承并按需定制元数据或厂商特定配置。文档列出的可用 triplet 共 5 个Triplets说明x86_64-oe-linux-gnu64 位 x86-64 Linux面向 Yoctoaarch64-oe-linux-gnu64 位 ARMv8-A Linux面向 Yoctoi686-oe-linux-gnu32 位 x86 Linux面向 Yoctoarmv7-oe-linux-gnueabihfARMv7-A 硬浮点 Linux面向 Yoctoriscv64-oe-linux-gnuRISC-V 64 位 Linux面向 Yocto目标维护者为 DeepeshWR见原文档 Target maintainers 一节。2. 各目标的源码定义与元数据每个 triplet 在 rustc_target 中都有独立的目标定义文件。以 x86_64_oe_linux_gnu.rs 为例pub(crate) fn target() - Target { let mut base super::x86_64_unknown_linux_gnu::target(); base.metadata TargetMetadata { description: Some(64-bit Linux (kernel 3.2, glibc 2.17) for yocto.into()), tier: Some(3), host_tools: Some(false), std: Some(true), }; base.llvm_target x86_64-oe-linux-gnu.into(); base.options.linker Some(x86_64-oe-linux-gcc.into()); base }从中可以提取出三个关键事实继承关系oe 目标以同架构的标准*-unknown-linux-gnu目标为基座super::x86_64_unknown_linux_gnu::target()完全复用其指针宽度、data layout、架构选项与 sanitizer 支持只替换元数据与链接器元数据tier: 3、host_tools: false不作为宿主工具链目标即不能用rustup target add后直接跑 bootstrap 工具、std: true标准库可用需要自行编译默认链接器硬编码为 OpenEmbedded 风格的架构专用 GCC 驱动如x86_64-oe-linux-gcc。其余 4 个目标的定义文件与元数据如下Triplets定义文件description 元数据默认链接器x86_64-oe-linux-gnux86_64_oe_linux_gnu.rs64-bit Linux (kernel 3.2, glibc 2.17) for yoctox86_64-oe-linux-gccaarch64-oe-linux-gnuaarch64_oe_linux_gnu.rs64-bit Linux (kernel 3.2, glibc 2.17) for yoctoaarch64-oe-linux-gcci686-oe-linux-gnui686_oe_linux_gnu.rs32-bit Linux (kernel 3.2, glibc 2.17) for yoctoi686-oe-linux-gccarmv7-oe-linux-gnueabihfarmv7_oe_linux_gnueabihf.rsArmv7-A Linux, hardfloat (kernel 3.2, glibc 2.17) for yoctoarm-oe-linux-gnueabi-gccriscv64-oe-linux-gnuriscv64_oe_linux_gnu.rsRISC-V Linux (kernel 4.20, glibc 2.29) for yoctoriscv64-oe-linux-gcc有两个值得注意的细节i686 目标的 CPU 特化i686_oe_linux_gnu.rs 在继承基座之外额外设置了base.options.cpu core2与base.options.features sse3即默认以 Core 2 为最低 CPU 基线并启用 SSE3armv7 的链接器命名尽管 triplet 是armv7-oe-linux-gnueabihf硬浮点其默认链接器却是arm-oe-linux-gnueabi-gcc注意是gnueabi而非gnueabihf与 OpenEmbedded 工具链驱动的实际命名保持一致这是从源码中可以直接确认的事实。5 个目标在 rustc_target 的目标注册表 中统一登记(aarch64-oe-linux-gnu, aarch64_oe_linux_gnu), (armv7-oe-linux-gnueabihf, armv7_oe_linux_gnueabihf), (i686-oe-linux-gnu, i686_oe_linux_gnu), (riscv64-oe-linux-gnu, riscv64_oe_linux_gnu), (x86_64-oe-linux-gnu, x86_64_oe_linux_gnu),3. 运行环境与工具链要求原文档对使用这些目标提出了两类硬性要求操作系统要求这些目标面向使用 OpenEmbedded 或 Yocto Project 构建系统生成的 Linux 系统。也就是说目标系统的 libc 是 glibc从继承的linux_gnu基座与元数据中的 glibc 版本要求可以看出内核版本下限因架构而异——x86_64/aarch64 要求 kernel 3.2、glibc 2.17i686 要求 kernel 3.2armv7 要求 kernel 3.2 glibc 2.17riscv64 要求 kernel 4.20 glibc 2.29各目标元数据中的 description 字段给出了对应的最低版本。C 工具链要求由于这些目标把架构专用的 OpenEmbedded GCC 驱动作为默认链接器构建环境中必须已经安装了与目标架构对应的 OpenEmbedded 交叉编译工具链。换句话说链接x86_64-oe-linux-gnu时PATH 中需可找到x86_64-oe-linux-gcc链接armv7-oe-linux-gnueabihf时需可找到arm-oe-linux-gnueabi-gcc其余目标同理。这正是使用架构专用 OpenEmbedded GCC 驱动作为默认链接器因此要求构建环境中有对应的 OpenEmbedded 交叉编译工具链这一文档要求的底层原因——链接器名称是编译目标时写死在目标定义里的rustc 会直接以该驱动名调用交叉工具链完成链接。4. 继承自标准 Linux gnu 目标的底层选项从源码结构看oe 目标的全部可移植行为都来自其基座。以x86_64-oe-linux-gnu为例基座 x86_64_unknown_linux_gnu.rs 设置了指针宽度 64、data layout、-m64前链接参数、内联栈探针以及 Address/CFI/KCFI/Dataflow/Leak/Memory/Safestack/Thread/Realtime 全套 sanitizer 支持。而所有*-unknown-linux-gnu目标的公共层 linux_gnu.rs 提供了let mut base TargetOptions { env: Env::Gnu, static_position_independent_executables: true, ..base::linux::opts() };即 GNU 环境的对象格式约定以及默认启用 static-PIE静态位置无关可执行文件的能力再往上是 linux.rs 提供的通用 Linux 基线选项。由于 oe 目标只是在这套继承链上替换 metadata 和 linker因此凡是标准 glibc 目标具备的 ABI 与代码生成特性oe 目标同样具备区别仅在于链接阶段交给 OpenEmbedded 工具链完成。5. 在 Yocto 工作流中如何使用结合原文档 Building 与 Building Rust programs 两节正确的使用姿势是不直接使用预编译制品Rust 不发布这些目标的预编译工具链或 std 制品需要通过 Yocto 的配方recipe在构建环境中用本仓库源码构建 Rustbootstrap作为基座被继承这些 triplet 提供的是基础目标定义下游 Yocto 生成的目标可以继承它们并定制元数据或厂商特定配置。如果你的项目需要myvendor-x86_64-oe-linux-gnu这类自定义 triplet可以从对应的 oe 基础目标定义复制并修改而不必从零编写确保交叉工具链就位在cargo build --target triplet之前确认对应架构的 OpenEmbedded 交叉工具链含*-oe-linux-gcc驱动已安装且位于 PATH 中。6. 与 C 代码混合链接原文档 Cross-compilation toolchains and C code 一节明确这些目标支持通过对应的 OpenEmbedded 交叉工具链与 C 代码链接。由于默认链接器本身就是交叉 GCC 驱动rustc 生成的对象文件在链接阶段会经由该驱动进入交叉工具链的标准链接流程因此 Rust 静态库/对象与 C 代码的混编遵循常规 GNU 工具链的链接规则无需额外的链接器配置。小结*-oe-linux-gnu系列是 Rust 面向 OpenEmbedded/Yocto 构建系统的 5 个 Tier 3 交叉目标它们复用同架构*-unknown-linux-gnu目标的代码生成与 ABI 设定将默认链接器替换为 OpenEmbedded 交叉 GCC 驱动并以基础目标定义的形式供下游 Yocto 目标继承扩展。使用时的三个前提——Yocto/ OE 构建环境、对应架构的 OpenEmbedded 交叉工具链、自行构建而非依赖预编译制品——在 官方文档 与 rustc_target 的目标定义源码中都有直接对应。【免费下载链接】rustEmpowering everyone to build reliable and efficient software.项目地址: https://gitcode.com/GitHub_Trending/ru/rust创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考