LLD provides much better compatibility with the GNU linker than before.
Now it is able to link the entire FreeBSD base system including the kernel
out of the box. We are working closely with the FreeBSD project to
make it usable as the system linker in a future release of the operating
system.
Multi-threading performance has been improved, and multi-threading
is now enabled by default. Combined with other optimizations, LLD 4.0
is about 1.5 times faster than LLD 3.9 when linking large programs
in our test environment.
Other notable changes are listed below:
- Error messages contain more information than before. If debug info
is available, the linker prints out not only the object file name
but the source location of unresolved symbols.
- Error messages are printed in red just like Clang by default. You
can disable it by passing -no-color-diagnostics.
- LLD’s version string is now embedded in a .comment section in the
result output file. You can dump it with this command: objdump -j -s
.comment <file>.
- The -Map option is supported. With that, you can print out section
and symbol information to a specified file. This feature is useful
for analyzing link results.
- The file format for the -reproduce option has changed from cpio to
tar.
- When creating a copy relocation for a symbol, LLD now scans the
DSO’s header to see if the symbol is in a read-only segment. If so,
space for the copy relocation is reserved in .bss.rel.ro instead of
.bss. This fixes a security issue that read-only data in a DSO
becomes writable if it is copied by a copy relocation. This issue
was disclosed originally on the
binutils mailing list.
- Compressed input sections are supported.
- --oformat binary, --section-start, -Tbss, -Tdata,
-Ttext, -b binary, -build-id=uuid, -no-rosegment,
-nopie, -nostdlib, -omagic, -retain-symbols-file,
-sort-section, -z max-page-size and -z wxneeded are
supported.
- A lot of linker script directives have been added.
- Default image base address for x86-64 has changed from 0x10000 to
0x200000 to make it huge-page friendly.
- ARM port now supports GNU ifunc, the ARM C++ exceptions ABI, TLS
relocations and static linking. Problems with dlopen() on systems
using eglibc fixed.
- MIPS port now supports input files in new R6 revision of MIPS ABIs
or N32 ABI. Generated file now contains .MIPS.abiflags section and
complete set of ELF headers flags.
- Relocations produced by the -mxgot compiler flag is supported
for MIPS. Now it is possible to generate “large” GOT that exceeds the 64K
limit.