编程 Rust 1.90:Linux 默认换成 LLD,cargo publish --workspace 原生支持工作区发布

2026-09-20 21:05:15

Rust 1.90:Linux 默认换成 LLD,cargo publish --workspace 开始原生支持工作区发布

发布信息:Rust 1.90.0 公告,逐条变更见 RELEASES.md。发布日 2025-09-18。

编译器与平台

x86_64-unknown-linux-gnu 默认用 LLD

这个目标之前默认跟 Linux 一样用 BFD,1.90 起换成 LLD。收益主要在三类场景:大二进制、带大量 debug 信息的二进制、以及增量重建——链接阶段的耗时下降明显。

需要退回 BFD 的话,命令行直接加链接参数:

RUSTFLAGS="-C link-arg=-fuse-ld=bfd" cargo build --release

项目里固定下来更省事,写进 .cargo/config.toml

[target.x86_64-unknown-linux-gnu]
rustflags = ["-C", "link-arg=-fuse-ld=bfd"]

取舍:LLD 在 debug 信息和增量场景下更快,但如果你依赖自定义链接脚本、非标准 section 布局,或者 CI 镜像里的 lld 版本偏旧,BFD 仍然更稳。回退只影响链接阶段,不影响编译产物语义。

Tier 3 的 musl 目标默认动态链接

受影响的目标:

  • mips64-unknown-linux-muslabi64
  • powerpc64-unknown-linux-musl
  • powerpc-unknown-linux-musl
  • powerpc-unknown-linux-muslspe
  • riscv32gc-unknown-linux-musl
  • s390x-unknown-linux-musl
  • thumbv7neon-unknown-linux-musleabihf

要回到静态链接,显式打开 crt-static

RUSTFLAGS="-C target-feature=+crt-static" cargo build --target s390x-unknown-linux-musl

x86_64-apple-darwin 降为 Tier 2 with host tools

从 Tier 1 with host tools 降到 Tier 2 with host tools。含义是:仍然保证能构建,包括 rustc、cargo 这些工具链组件;但不再保证通过自动化测试套件。

Cargo:cargo publish --workspace

现在可以一次性发布整个工作区:

cargo publish --workspace --dry-run
cargo publish --workspace

Cargo 会自动按 crate 之间的依赖顺序发布,不再需要外部工具或手工排序。集成进 Cargo 之后,--dry-run 能对整个待发布集合做 publish 验证构建。

注意发布仍然不是原子操作:网络错误或服务端故障都可能让工作区只发布了一部分,中断后剩下的 crate 需要手动补发。

语言

  • unknown_or_malformed_diagnostic_attributes lint 拆成四个更细的 lint,原名变成 lint 组:unknown_diagnostic_attributesmisplaced_diagnostic_attributesmalformed_diagnostic_attributesmalformed_diagnostic_format_literals
  • 允许最终值引用可变或外部内存的常量,但这类常量不能再用作模式(pattern)。
  • 允许对非 Rust 内存做 volatile 访问,包括地址 0。

标准库

  • 稳定 u*::{checked, overflowing, saturating, wrapping}_sub_signed
  • 允许 CStrCStringCow 之间互相比较。
  • 移除部分 unsized tuple 的 impl(unsized 元组本来就无法构造)。
  • UnixStream 设置 MSG_NOSIGNAL
  • proc_macro::Ident::new 支持 $crate
  • 保证 Thread::into_raw 返回的指针至少 8 字节对齐。

稳定的 API

u{n}::checked_sub_signed
u{n}::overflowing_sub_signed
u{n}::saturating_sub_signed
u{n}::wrapping_sub_signed
impl Copy for IntErrorKind
impl Hash for IntErrorKind
CStr / CString / Cow 的 PartialEq 系列

const 上下文稳定的 API:

<[T]>::reverse
f32::floor / ceil / trunc / fract / round / round_ties_even
f64::floor / ceil / trunc / fract / round / round_ties_even

兼容性说明

  • UnixStream 设置 MSG_NOSIGNAL:可能改变程序行为,但和其他原语(stdout、网络 socket)保持一致。如果你的程序依赖收到信号来终止,需要改 socket 写错误的处理方式——写失败就直接退出。
  • Unix 上 std::env::home_dirHOME 未设置时会走回退逻辑。
  • 一致地拒绝不支持的 extern "{abi}",例如在不支持该 ABI 的平台上,对 extern "stdcall" 函数指针实现 trait。
  • const-eval:初始化某个 static 时对该 static 写入会报错。
  • 检查 proc_macro_derive 宏应用于 crate root 时参数是否正确。

Rustdoc

可以折叠所有 impl 块(按住 shift 时),unsafe 属性以 unsafe() 包裹显示。

复制全文 生成海报 Rust 编译器 Cargo 工具链 性能优化

推荐文章

程序员茄子在线接单