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-muslabi64powerpc64-unknown-linux-muslpowerpc-unknown-linux-muslpowerpc-unknown-linux-muslsperiscv32gc-unknown-linux-musls390x-unknown-linux-muslthumbv7neon-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_attributeslint 拆成四个更细的 lint,原名变成 lint 组:unknown_diagnostic_attributes、misplaced_diagnostic_attributes、malformed_diagnostic_attributes、malformed_diagnostic_format_literals。- 允许最终值引用可变或外部内存的常量,但这类常量不能再用作模式(pattern)。
- 允许对非 Rust 内存做 volatile 访问,包括地址 0。
标准库
- 稳定
u*::{checked, overflowing, saturating, wrapping}_sub_signed。 - 允许
CStr、CString、Cow之间互相比较。 - 移除部分 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_dir在HOME未设置时会走回退逻辑。 - 一致地拒绝不支持的
extern "{abi}",例如在不支持该 ABI 的平台上,对extern "stdcall"函数指针实现 trait。 - const-eval:初始化某个
static时对该static写入会报错。 - 检查
proc_macro_derive宏应用于 crate root 时参数是否正确。
Rustdoc
可以折叠所有 impl 块(按住 shift 时),unsafe 属性以 unsafe() 包裹显示。