ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Rust 编译器对 FreeBSD 平台的支持:目标层级、Tier 保障与构建安装实战

Rust 编译器对 FreeBSD 平台的支持:目标层级、Tier 保障与构建安装实战 Rust 编译器对 FreeBSD 平台的支持目标层级、Tier 保障与构建安装实战【免费下载链接】rustEmpowering everyone to build reliable and efficient software.项目地址: https://gitcode.com/GitHub_Trending/ru/rust本指南基于 rustc 官方平台支持文档 freebsd.md 编写系统梳理*-unknown-freebsd系列目标的层级划分、发布版本支持矩阵、ABI 与二进制格式约定并结合 rustc_target 源码逐一剖析每个目标的底层配置同时给出 rustup 与 FreeBSD ports/pkg 两种获取工具链与目标产物的完整实操路径。读完本文你将掌握在 FreeBSD 上原生开发、或从其他主机交叉编译到 FreeBSD以及自行构建非官方支持目标的具体方法。FreeBSD 目标总览与层级划分FreeBSD 是一个基于 4.4BSD 的多平台类 UNIX 操作系统。Rust 编译器rustc将其支持的平台按目标三元组target triple标识并按Tier 1 / Tier 2 / Tier 3三级划分保障级别。完整的目标列表见 platform-support.md各层级的策略含义可概括为Tier 1可视为保证可用guaranteed to workRust 项目为每个 Tier 1 目标构建官方二进制发行版并在每次变更后自动构建和测试。Tier 2 with Host Tools可视为保证可构建guaranteed to build官方构建标准库或仅core的二进制发行版并额外支持rustc、cargo等工具在目标上原生运行使其能作为开发平台使用Tier 2 目标支持完整标准库。Tier 2 without Host Tools同样是保证可构建但工具链不在该目标上原生运行只能作为编译目标使用。Tier 3社区维护、无自动构建与测试保障的目标需通过 FreeBSD ports 系统自行构建。FreeBSD 相关目标的整体定位为Tier 2/3具体划分如下目标三元组层级Host 工具std说明x86_64-unknown-freebsdTier 2✓✓64 位 FreeBSDaarch64-unknown-freebsdTier 2✓✓ARM64 FreeBSDi686-unknown-freebsdTier 2✗✓32 位 x86 FreeBSDPentium 4armv6-unknown-freebsd-gnueabihfTier 3✓✓Armv6 FreeBSDarmv7-unknown-freebsd-gnueabihfTier 3✓✓Armv7-A FreeBSDpowerpc-unknown-freebsdTier 3✗✓PowerPC FreeBSD32 位powerpc64-unknown-freebsdTier 3✓✓PPC64 FreeBSDELFv2powerpc64le-unknown-freebsdTier 3✓✓PPC64LE FreeBSDELFv2riscv64gc-unknown-freebsdTier 3✗✓RISC-V 64 FreeBSD其中x86_64-unknown-freebsd与aarch64-unknown-freebsd是Tier 2 with Host Toolsi686-unknown-freebsd是Tier 2 without Host Tools其余均为 Tier 3。上表后半部分 Tier 3 目标的信息来自 rustc_target/src/spec/targets 目录下各目标定义文件中TargetMetadata的tier、host_tools、std字段。目标维护者*-unknown-freebsd系列目标的维护者为asomersMikaelUrankar社区修复与改进可以通过他们提交 PR 或 issue平台相关代码改动主要落在 rustc_target 的目标定义文件与标准库的 FreeBSD 相关实现中。支持承诺与发布版本矩阵Rust 项目对 FreeBSD 作出明确承诺rustc 将在当前所有受支持的 FreeBSD 发行版本上运行已停止支持EoL的版本也可能在一段时间内继续可用该保证同样适用于标准库std与 libc crate。文档给出了截至Rust 1.82.0的具体版本支持矩阵FreeBSD 发行版rustcstdlibc10 1.78.0??11 1.78.0 1.78.0current12currentcurrentcurrent解读FreeBSD 12 及更新版本获得 rustc、std、libc 的当前版本current支持FreeBSD 11 上 rustc 与 std 的支持止步于 1.78.0 之前libc 仍为 currentFreeBSD 10 上 rustc 支持止步于 1.78.0 之前std 与 libc 状态未知。这意味着若要在较新的 FreeBSD 发行版上长期跟踪 Rust 版本应使用 FreeBSD 12 及以上版本。ABI 约定与二进制格式C ABIextern C使用各架构的官方调用约定official calling convention即与 FreeBSD 系统库、C 编译器如 clang/gcc生成的代码二进制兼容可直接链接系统动态库或编写 FFI。文件格式FreeBSD 系统二进制使用ELF文件格式。从源码层面看ABI 相关选项被固化在各目标定义中例如i686-unknown-freebsd显式指定RustcAbi::X86Sse2见 i686_unknown_freebsd.rsarmv6/armv7目标指定CfgAbi::EabiHf与FloatAbi::Hard硬浮点 EABI见 armv6_unknown_freebsd.rs、armv7_unknown_freebsd.rsPowerPC 系列使用 ELFv2 ABI见 powerpc64_unknown_freebsd.rs、powerpc64le_unknown_freebsd.rs。源码视角FreeBSD 目标的公共底层选项所有 FreeBSD 目标都通过base::freebsd::opts()继承一组公共选项定义位于 compiler/rustc_target/src/spec/base/freebsd.rs核心配置及其含义如下选项值含义osOs::FreeBsd目标操作系统标识dynamic_linkingtrue支持动态链接FreeBSD 默认动态链接系统库familiesunix属于 Unix 目标族参与#[cfg(unix)]条件编译has_rpathtrue支持 rpath可嵌入运行时库搜索路径crt_static_respectedtrue尊重-C target-featurecrt-static静态 CRT 选项position_independent_executablestrue默认生成 PIE 可执行文件relro_levelRelroLevel::Full启用完整 RELRO加固 GOT/PLT 重定位段has_thread_localtrue支持线程局部存储TLSabi_return_struct_as_inttrue结构体按整数返回的 ABI 处理策略default_dwarf_version2默认 DWARF 调试信息版本这些选项决定了在 FreeBSD 上编译出的二进制默认具备 PIE、完整 RELRO、rpath 等系统级安全与兼容属性。各 FreeBSD 目标的差异化配置剖析x86_64-unknown-freebsdTier 2含 Host 工具定义见 x86_64_unknown_freebsd.rsCPU 基线为x86-64max_atomic_width 64即原生支持 64 位原子操作plt_by_default false默认不强制生成 PLT 间接调用链接参数-m64明确 64 位链接栈探测方式为内联StackProbeType::Inline用于栈溢出检测支持ASan / CFI / MSan / TSan四类 sanitizer且supports_xray true支持 XRay 性能追踪。aarch64-unknown-freebsdTier 2含 Host 工具定义见 aarch64_unknown_freebsd.rs目标特性v8aARMv8-A 基线max_atomic_width 128支持 128 位原子操作与 x86_64 目标同样支持 ASan/CFI/MSan/TSan 四类 sanitizer栈探测同样为内联方式。i686-unknown-freebsdTier 2无 Host 工具定义见 i686_unknown_freebsd.rsABI 固定为RustcAbi::X86Sse2默认使用 SSE2 指令详见下文专门小节CPU 基线pentium4max_atomic_width 64链接参数-m32 -Wl,-znotext32 位链接并允许可写代码段该目标只能作为编译目标rustc/cargo不在其上原生运行。Tier 3 目标ports 自行构建riscv64gc-unknown-freebsdriscv64gc_unknown_freebsd.rsRISC-V 64llvm_abiname Lp64d特性m,a,f,d,c,zicsr,zifencei代码模型 MediumCPU 基线generic-rv64armv7-unknown-freebsd-gnueabihfarmv7_unknown_freebsd.rsArmv7-A硬浮点 EABI特性v7,vfp3d16,thumb2,-neonarmv6-unknown-freebsd-gnueabihfarmv6_unknown_freebsd.rsArmv6硬浮点 EABI特性v6,vfp2powerpc64-unknown-freebsdpowerpc64_unknown_freebsd.rsPPC64 大端ELFv2 ABI-m64powerpc64le-unknown-freebsdpowerpc64le_unknown_freebsd.rsPPC64LE 小端ELFv2 ABI额外链接-lgcc以解析long doubleIEEE-128的软浮点辅助函数powerpc-unknown-freebsdpowerpc_unknown_freebsd.rs32 位大端 PowerPC启用secure-plt安全 PLT链接参数中附带--targetpowerpc-unknown-freebsd13.0。这些 Tier 3 目标的二进制产物不随官方发行版分发需通过 FreeBSD ports 系统构建。构建 Rust 程序三种获取途径1. rustup 安装Tier 2 官方产物x86_64-unknown-freebsd、aarch64-unknown-freebsd、i686-unknown-freebsd三个目标由 Rust 项目分发官方产物可直接通过 rustup 安装# 在任意主机上安装目标产物交叉编译用 rustup target add x86_64-unknown-freebsd rustup target add aarch64-unknown-freebsd rustup target add i686-unknown-freebsd # 查看已安装目标 rustup target list --installed安装完成后即可从当前主机交叉编译到 FreeBSDcargo build --target x86_64-unknown-freebsd在 FreeBSD 本机x86_64/aarch64上由于是含 Host 工具的 Tier 2 目标工具链可直接原生运行cargo build默认即针对本机 FreeBSD 构建无需额外指定目标。需要说明的是Tier 2 目标通常不构建rust-docs组件rustup 可能代之以安装同类 Tier 1 目标的文档。2. pkg(7) 二进制包其余目标由 FreeBSD ports 系统构建可通过pkg(7)安装预编译的二进制包例如安装包含 Rust 工具链与目标的 lang/rust 包pkg install rustpkg(7) 方式适合不想从源码编译、直接获取二进制产物的场景可用的具体包名以 FreeBSD 官方 pkg 仓库为准。3. ports(7) 源码构建通过ports(7)从源码构建 lang/rustcd /usr/ports/lang/rust make installports 方式可以自定义构建选项例如下一节 SSE2 开关也能生成 doc 等额外组件适合需要深度定制的场景。i686-unknown-freebsd 与 SSE2 指令的特殊说明按默认配置i686-unknown-freebsd目标默认使用 SSE2 指令源码中体现为RustcAbi::X86Sse2见 i686_unknown_freebsd.rs。如果需要构建不要求 SSE2的代码例如面向不支持 SSE2 的早期 32 位 CPU可以从 ports 构建lang/rust在构建时禁用SSE2选项。但文档明确警告这样生成的代码会表现为不符合规范non-compliant behavior详情见 GitHub issue #114479即 x86 32 位浮点相关问题。因此在生产环境中除非确有兼容旧硬件需求否则应保持默认 SSE2 配置。运行 Rust 测试套件Rust 测试套件在 FreeBSD 上有两种运行方式原生运行在 FreeBSD 上直接运行 Rust 仓库的测试套件。对于从源码构建编译器的场景可在仓库根目录使用./x.py test构建入口见仓库根目录的 x.py运行编译器的原生测试。通过 ports 运行在 FreeBSD ports 树的lang/rust目录内执行cd /usr/ports/lang/rust make test由于x86_64-unknown-freebsd与aarch64-unknown-freebsd是含 Host 工具的 Tier 2 目标测试套件可在这些平台上原生完整运行这也是验证工具链在目标硬件上正确性的主要手段。小结FreeBSD 在 Rust 平台支持矩阵中占据稳定的 Tier 2/3 位置x86_64与aarch64提供含 Host 工具的完整官方支持可原生开发也可交叉编译i686作为纯编译目标由 rustup 分发其余 ARM/PowerPC/RISC-V 目标由 ports 生态覆盖。版本支持上FreeBSD 12 获得 rustc、std、libc 的全量当前版本支持。若想进一步深入可阅读完整目标列表 platform-support.md 以及各目标的源码定义 rustc_target/src/spec/targets 目录。【免费下载链接】rustEmpowering everyone to build reliable and efficient software.项目地址: https://gitcode.com/GitHub_Trending/ru/rust创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表