内容提要
Rust 发布 1.99.1 版本,修复三个回归问题:部分目标缺失 wcslen 符号导致链接错误,UEFI 目标受影响;x86_64 上 FFI 返回 bool 值可能未指定高位,现恢复零扩展;macOS 上 rust-lld 因缺少库搜索路径无法加载 libLLVM,现加入 rpath。
延伸解读
回归修复的针对性
1.99.1 是一个点发布,专门修复三个回归问题,而非引入新功能。这些问题分别影响链接、FFI 返回值和 macOS 上的链接器,说明它们可能破坏现有项目的构建或运行时行为。用户若从更早版本升级,应留意这些修复是否解决了自己遇到的类似错误。
UEFI 目标受影响最大
缺失 wcslen 符号导致部分目标链接失败,其中 UEFI 目标受影响最严重:任何使用 std 的项目都会因预编译标准库中的调用而无法构建。修复方式是在 compiler-builtins 中提供回退实现。使用 UEFI 的开发者应优先升级到 1.99.1。
FFI bool 返回值的 ABI 要求
在 x86_64 上,通过 FFI 返回 bool 的函数可能未将返回寄存器的高位清零,调用方可能观察到 0 或 1 以外的值。1.99.1 重新将该返回类型标记为零扩展,以符合 ABI 要求。涉及跨语言调用的项目应验证升级后行为是否一致。
macOS 链接器路径修复
在 macOS 上,若未通过 rustup 代理调用编译器,rust-lld 可能因缺少库搜索路径而无法加载 libLLVM。1.99.1 为 rust-lld 添加了指向 libLLVM.dylib 所在目录的 rpath。直接调用编译器或使用自定义工具链的用户可能因此受益。
Q&A
Rust 1.99.1 修复了哪些回归问题?
Rust 1.99.1 修复了三个回归问题:1) 部分目标缺失 wcslen 符号导致链接错误,UEFI 目标受影响;2) x86_64 上 FFI 返回 bool 值可能未指定高位,现恢复零扩展;3) macOS 上 rust-lld 因缺少库搜索路径无法加载 libLLVM,现加入 rpath。
如何升级到 Rust 1.99.1?
如果你已经通过 rustup 安装了 Rust,只需运行 `rustup update stable` 即可升级到 1.99.1。如果尚未安装 rustup,可以从官网相应页面获取。
为什么 UEFI 目标在 Rust 1.99.1 之前会链接失败?
因为 LLVM 的 loop-idiom-wcslen 优化可能引入对 wcslen 的调用,而一些 Rust 目标(尤其是 UEFI)的 libc 或其他地方没有提供该函数,导致链接错误。Rust 1.99.1 在 compiler-builtins 库中添加了 wcslen 作为回退。
x86_64 上 FFI 返回 bool 值有什么问题?
在 x86_64 上,通过 FFI 返回 bool 的 Rust 函数可能使返回寄存器的高位(第1-7位)未指定,导致调用者观察到非0非1的原始值。Rust 1.99.1 重新将该返回类型标记为零扩展,以符合 ABI 要求。
macOS 上 rust-lld 无法加载 libLLVM 的问题如何解决?
Rust 1.99.1 为 rust-lld 添加了 rpath 条目,指向包含 libLLVM.dylib 的目录,从而确保链接器能够找到并加载该库。
如何帮助测试未来的 Rust 版本?
你可以考虑在本地和 CI 中使用 beta 和 nightly 渠道,分别通过 `rustup default beta` 和 `rustup default nightly` 切换,并报告遇到的任何 bug。