lld 9.0.0 Release Notes¶
Introduction¶
lld is a high-performance linker that supports ELF (Unix), COFF (Windows), Mach-O (macOS), MinGW and WebAssembly. lld is command-line-compatible with GNU linkers and Microsoft link.exe and is significantly faster than the system default linkers.
lld 9 has lots of feature improvements and bug fixes.
Non-comprehensive list of changes in this release¶
ELF Improvements¶
ld.lld now has typo suggestions for flags:
$ ld.lld --call-shared
now printsunknown argument '--call-shared', did you mean '--call_shared'
. (r361518)--allow-shlib-undefined
and--no-allow-shlib-undefined
options are added.--no-allow-shlib-undefined
is the default for executables. (r352826)-nmagic
and-omagic
options are fully supported. (r360593)Segment layout has changed. PT_GNU_RELRO, which was previously placed in the middle of readable/writable PT_LOAD segments, is now placed at the beginning of them. This change permits lld-produced ELF files to be read correctly by GNU strip older than 2.31, which has a bug to discard a PT_GNU_RELRO in the former layout.
-z common-page-size
is supported. (r360593)Diagnostics messages have improved. A new flag
--vs-diagnostics
alters the format of diagnostic output to enable source hyperlinks in Microsoft Visual Studio IDE.Linker script compatibility with GNU BFD linker has generally improved.
The clang
--dependent-library
form of autolinking is supported.This feature is added to implement the Windows-style autolinking for Unix. On Unix, in order to use a library, you usually have to include a header file provided by the library and then explicitly link the library with the linker
-l
option. On Windows, header files usually contain pragmas that list needed libraries. Compilers copy that information to object files, so that linkers can automatically link needed libraries.--dependent-library
is added for implementing that Windows semantics on Unix. (r360984)AArch64 BTI and PAC are supported. (r362793)
lld now supports replacing
JAL
withJALX
instructions in case of MIPS-microMIPS cross-mode jumps. (r354311)lld now creates LA25 thunks for MIPS R6 code. (r354312)
Put MIPS-specific .reginfo, .MIPS.options, and .MIPS.abiflags sections into corresponding PT_MIPS_REGINFO, PT_MIPS_OPTIONS, and PT_MIPS_ABIFLAGS segments.
The quality of RISC-V and PowerPC ports have greatly improved. Many applications can now be linked by lld. PowerPC64 is now almost production ready.
The Linux kernel for arm32_7, arm64, ppc64le and x86_64 can now be linked by lld.
DF_STATIC_TLS flag is set for i386 and x86-64 when needed. (r353293, r353378)
The experimental partitioning feature is added to allow a program to be split into multiple pieces.
The feature allows you to semi-automatically split a single program into multiple ELF files called “partitions”. Since all partitions share the same memory address space and don’t use PLT/GOT, split programs run as fast as regular programs.
With the mechanism, you can start a program only with a “main” partition and load remaining partitions on-demand. For example, you can split a web browser into a main partition and a PDF reader sub-partition and load the PDF reader partition only when a user tries to open a PDF file.
See the documentation for more information.
If “-” is given as an output filename, lld writes the final result to the standard output. Previously, it created a file “-” in the current directory. (r351852)
-z ifunc-noplt
option is added to reduce IFunc function call overhead in a freestanding environment such as the OS kernel.Functions resolved by the IFunc mechanism are usually dispatched via PLT and thus slower than regular functions because of the cost of indirection. With
-z ifunc-noplt
, you can eliminate it by doing text relocations at load-time. You need a special loader to utilize this feature. This feature is added for the FreeBSD kernel but can be used by any operating systems. (r360685)--undefined-glob
option is added. The new option is an extension to--undefined
to take a glob pattern instead of a single symbol name. (r363396)
COFF Improvements¶
- Like the ELF driver, lld-link now has typo suggestions for flags. (r361518)
- lld-link now correctly reports duplicate symbol errors for object
files that were compiled with
/Gy
. (r352590) - lld-link now correctly reports duplicate symbol errors when several
resource (.res) input files define resources with the same type,
name and language. This can be demoted to a warning using
/force:multipleres
. (r359829) - lld-link now rejects more than one resource object input files, matching link.exe. Previously, lld-link would silently ignore all but one. If you hit this: Don’t pass resource object files to the linker, instead pass res files to the linker directly. Don’t put resource files in static libraries, pass them on the command line. (r359749)
- Having more than two
/natvis:
now works correctly; it used to not work for larger binaries before. (r327895) - Undefined symbols are now printed only in demangled form. Pass
/demangle:no
to see raw symbol names instead. (r355878) - Several speed and memory usage improvements.
- lld-link now supports resource object files created by GNU windres and MS cvtres, not only llvm-cvtres.
- The generated thunks for delayimports now share the majority of code among thunks, significantly reducing the overhead of using delayimport. (r365823)
IMAGE_REL_ARM{,64}_REL32
relocations are supported. (r352325)- Range extension thunks for AArch64 are now supported, so lld can create large executables for Windows/ARM64. (r352929)
- The following flags have been added:
/functionpadmin
(r354716),/swaprun:
(r359192),/threads:no
(r355029),/filealign
(r361634)
WebAssembly Improvements¶
- Imports from custom module names are supported. (r352828)
- Symbols that are in llvm.used are now exported by default. (r353364)
- Initial support for PIC and dynamic linking has landed. (r357022)
- wasm-ld now add
__start_
/__stop_
symbols for data sections. (r361236) - wasm-ld now doesn’t report an error on archives without a symbol index. (r364338)
- The following flags have been added:
--emit-relocs
(r361635),--wrap
(r361639),--trace
and--trace-symbol
(r353264).
MinGW Improvements¶
- lld now correctly links crtend.o as the last object file, handling terminators for the sections such as .eh_frame properly, fixing DWARF exception handling with libgcc and gcc’s crtend.o.
- lld now also handles DWARF unwind info generated by GCC, when linking with libgcc.
- PDB output can be requested without manually specifying the PDB file
name, with the new option
-pdb=
with an empty value to the option. (The old existing syntax-pdb <filename>
was more cumbersome to use with an empty parameter value.) --no-insert-timestamp
option is added as an alias to/timestamp:0
. (r353145)- Many more GNU ld options are now supported, which e.g. allows the lld MinGW frontend to be called by GCC.
- The following options are added:
--exclude-all-symbols
,--appcontainer
,--undefined