tech, developers, and the code underneath

issue 072· news·

Rust 1.90 and the linker nobody talks about

LLD becomes the default linker on x86-64 Linux. Link times drop and nobody notices, which is the point.

Rust 1.90 makes LLD the default linker for x86_64-unknown-linux-gnu. This is a build-time performance change with no user-facing API and it is one of the more useful things to ship this year.

why linking matters#

For a large Rust binary, linking is frequently the dominant cost of an incremental build. You change one line, the compiler recompiles one crate quickly, and then the linker spends several seconds stitching together a hundred megabytes of object files and debug information.

GNU ld is old, single-threaded in the parts that matter, and was designed for a different era of binary sizes. lld is parallel, substantially faster, and has been production-ready for years — it is the default on several other platforms already.

Reported improvements vary by project, with the largest gains on debug builds of large dependency trees. Two to five times faster linking is a common range. If your edit-compile-run loop is four seconds and linking was two of them, you feel this every single time.

how to check#

bash
cargo build --timings

Opens an HTML report showing where time went, including link time as a distinct phase. Most people have never looked at this and are surprised by what it says.

If you were already opting into lld or mold via .cargo/config.toml, nothing changes for you. If you were not — which is most people, because the configuration was obscure and required knowing it existed — you get the improvement for free on upgrade.

the general lesson#

Defaults are the most impactful thing a toolchain ships.

A faster linker has been available for years. Anyone could have configured it. The instructions were in a blog post. Almost nobody did, because it required knowing the option existed, knowing it was safe, and caring enough to edit a config file.

Changing the default delivers the improvement to everyone at once. That is worth more than a decade of documentation.

This generalizes. If you maintain a tool and you find yourself writing documentation explaining how to enable a better behavior, ask whether the better behavior should be the default. The answer is usually yes, and the reason it is not is usually caution about breaking a small number of unusual setups — which is a real concern that should be handled with a flag to opt out, not a flag to opt in.

the rest of 1.90#

  • Cargo workspace publishingcargo publish --workspace publishes multiple interdependent crates in the correct order. Anyone maintaining a multi-crate project has written a shell script for this. Now you can delete it.
  • Demoted target tiers for several less-used platforms.
  • x86_64-apple-darwin demoted to tier 2 with host tools still provided, which reflects where Apple hardware has actually gone.
  • The usual const stabilizations and API additions.

the trend line#

Rust's reputation for slow compilation is the single most cited objection to adopting it, and it has been steadily addressed for years: incremental compilation, parallel front-end work, the new trait solver, better caching, and now the linker.

Compile times are meaningfully better than they were three years ago and still slower than Go. That gap is partly fundamental — monomorphization and the amount of optimization Rust does are not free — and partly still addressable.

Anyone who tried Rust in 2021 and bounced off the build times should try again. The numbers are different now.

Dom, September 19, 2025

get README in your inbox

One dispatch, no noise. Tech and developer news, plus the occasional long piece on the craft.

subscribe →