lld 22.1.0 Release Notes

Introduction

This document contains the release notes for the lld linker, release 22.1.0. Here we describe the status of lld, including major improvements from the previous release. All lld releases may be downloaded from the LLVM releases web site.

Non-comprehensive list of changes in this release

ELF Improvements

  • Added --print-gc-sections=<file> to redirect garbage collection section listing to a file, avoiding contamination of stdout with other linker output. (#159706)

  • Added VersionNode lexer state for better version script parsing. This brings the lexer behavior closer to GNU ld. (#174530)

  • Unversioned undefined symbols now use version index 0, aligning with GNU ld 2.46 behavior. (#168189)

  • .data.rel.ro.hot and .data.rel.ro.unlikely are now recognized as RELRO sections, allowing profile-guided static data partitioning. (#148920)

  • DTLTO now supports archive members and bitcode members of thin archives. (#157043)

  • For DTLTO, --thinlto-remote-compiler-prepend-arg=<arg> has been added to prepend an argument to the remote compiler’s command line. (#162456)

  • Balanced Partitioning (BP) section ordering now skips input sections with null data, and filters out section symbols. (#149265) (#151685)

  • For AArch64, fixed a crash when using --fix-cortex-a53-843419 with synthetic sections and improved handling when patched code is far from the short jump. (#170495)

  • For AArch64, added support for the R_AARCH64_FUNCINIT64 dynamic relocation type for relocating word-sized data using the return value of a function. (#156564)

  • For AArch64, added support for the R_AARCH64_PATCHINST relocation type to support deactivation symbols. (#133534)

  • For AArch64, added support for reading AArch64 Build Attributes and converting them into GNU Properties. (#147970)

  • For ARM, fixed incorrect veneer generation for wraparound branches at the high end of the 32-bit address space branching to the low end. (#165263)

  • For LoongArch, -r now synthesizes R_LARCH_ALIGN at input section start to preserve alignment information. (#153935)

  • For LoongArch, added relocation types for LA32R/LA32S. (#172618) (#176312)

  • For RISC-V, added infrastructure for handling vendor-specific relocations. (#159987)

  • For RISC-V, added support for statically resolved vendor-specific relocations. (#169273)

  • For RISC-V, -r now synthesizes R_RISCV_ALIGN at input section start to preserve alignment information during two-stage linking. (#151639)

Breaking changes

COFF Improvements

  • Added -prefetch-inputs to improve link times by asynchronously loading input files in RAM. This will dampen the effect of input file I/O latency on link times. However this flag can have an adverse effect when linking a large number of inputs files, or if all inputs do not fit in RAM at once. For those cases, linking might be a bit slower since the inputs will be streamed into RAM upfront, only to be evicted later by swapping. (#169224)

  • Added /sectionlayout:@<file> to specify custom output section ordering. (#152779)

  • Added /nodbgdirmerge to emit the debug directory section in .cvinfo instead of merging it to .rdata. (#159235)

  • Added -fat-lto-objects to support FatLTO. Without -fat-lto-objects or with -fat-lto-objects:no, LLD will link LLVM FatLTO objects using the relocatable object file. (#165529)

  • Added /linkreprofullpathrsp to print the full path to each object passed to the link line to a file. This is used in particular when linking Arm64X binaries. (#174971)

  • Added CET flags: /cetcompatstrict, /cetipvalidationrelaxed, /cetdynamicapisinproc, and /hotpatchcompatible. (#150761)

  • Added support for ARM64X same-address thunks. (#151255)

  • Added more --time-trace tags for ThinLTO linking. (#156471)

  • /summary now works when /debug isn’t provided. (#157476)

  • /summary now displays the size of all consumed inputs. (#157284)

  • For DTLTO, -thinlto-remote-compiler-prepend-arg:<arg> has been added to prepend an argument to the remote compiler’s command line. (#162456)

  • Loop and SLP vectorize options are now passed to the LTO backend. (#173041)

  • Deduplicate common chunks when linking COFF files. (#162553)

  • Discard .llvmbc and .llvmcmd sections. (#150897)

  • Prevent emitting relocations for discarded weak wrapped symbols. (#156214)

MinGW Improvements

  • Added --fat-lto-objects flag. (#174962)

  • Handle -m mipspe for MIPS. (#157742)

  • Fixed implicit DLL entry point for MinGW. (#171680)

MachO Improvements

  • Added --read-workers=<N> for multi-threaded preload of input files into memory, significantly reducing link times for large projects. (#147134)

  • Added --separate-cstring-literal-sections to emit cstring literals into sections defined by their section name. (#158720)

  • Added --tail-merge-strings to enable tail merging of cstrings. (#161262)

  • Added --lto-emit-llvm command line option.

  • Added --slop-scale flag for adjusting slop scale. (#164295)

  • Added support for section branch relocations, including the 1-byte form. (#169062)

  • Enabled Linker Optimization Hints pass for arm64_32. (#148964)

  • Read cstring order for non-deduped sections. (#161879)

  • Allow independent override of weak symbols aliased via .set. (#167825)

  • Fixed segfault while processing malformed object file. (#167025)

  • Fixed infinite recursion when parsing corrupted export tries. (#152569)

  • Error out gracefully when offset is outside literal section. (#164660)

  • Process OSO prefix only textually in both input and output. (#152063)

WebAssembly Improvements

  • --stack-first is now the default. Use --no-stack-first for the old behavior. (#166998)

  • --import-memory can now take a single name (imports from default module). (#160409)

  • -r now forces -Bstatic. (#108264)

  • LTO now uses PIC reloc model with dynamic imports. (#165342)

  • Honor command line reloc model during LTO. (#164838)

  • Fixed visibility of __stack_pointer global. (#161284)

  • Fixed check for exporting mutable globals. (#160787)

  • Fixed check for implicitly exported mutable globals. (#160966)

  • Don’t export deps for unused stub symbols. (#173422)

  • Fixed SEGFAULT when importing wrapped symbol. (#169656)

  • Error on unexpected relocation types in -pie/-shared data sections. (#162117)

Fixes