Table Of Contents

Previous topic

Windows support

This Page

lld 5.0.0 Release Notes


lld is a linker from the LLVM project. It supports ELF (Unix), COFF (Windows) and Mach-O (macOS), and it is generally faster than the GNU bfd or gold linkers or the MSVC linker.

lld is designed to be a drop-in replacement for the system linkers, so that users don’t need to change their build systems other than swapping the linker command.

All lld releases may be downloaded from the LLVM releases web site.

Non-comprehensive list of changes in this release

ELF Improvements

  • First and foremost, a lot of compatibility issues and bugs have been fixed. Linker script support has significantly improved. As a result, we believe you are very likely to be able to link your programs with lld without experiencing any problem now.

  • Error message format has changed in order to improve readability. Traditionally, linker’s error messages are concise and arguably too terse. This is an example of lld 4.0.0’s error message (they are actually in one line):

    /ssd/clang/bin/ld.lld: error: /ssd/llvm-project/lld/ELF/Writer.cpp:207:
      undefined symbol 'lld::elf::EhFrameSection::addSection()'

    It is not easy to read because too much information is packed into a single line and the embedded text, particularly a symbol name, is sometimes too long. In lld 5.0.0, we use more vertical space to print out error messages in a more structured manner like this:

    bin/ld.lld: error: undefined symbol: lld::elf::EhFrameSection::addSection()
    >>> Referenced by Writer.cpp:207 (/ssd/llvm-project/lld/ELF/Writer.cpp:207)
    >>>               Writer.cpp.o in archive lib/liblldELF.a

    As a bonus, the new error message contains source code location of the error if it is available from debug info.

  • ./configure scripts generated by GNU autoconf determines whether a linker supports modern GNU-compatible features or not by searching for “GNU” in the --help message. To be compatible with the scripts, we decided to add a string “(compatible with GNU linkers)” to our --help message. This is a hack, but just like the web browser’s User-Agent string (which everyone still claim they are “Mozilla/5.0”), we had no choice other than doing this to claim that we accept GNU-compatible options.

  • The -Map option is added. The option is to make the linker to print out how input files are mapped to the output file. Here is an example:

    Address          Size             Align Out     In      Symbol
    00000000016d84d8 00000000008f8f50     8 .eh_frame
    00000000016d84d8 00000000008f8f50     8         <internal>:(.eh_frame)
    0000000001fd2000 00000000034b3bd0    16 .text
    0000000001fd2000 000000000000002a     1         /usr/lib/x86_64-linux-gnu/crt1.o:(.text)
    0000000001fd2000 0000000000000000     0                 _start
    0000000001fd202a 0000000000000000     1         /usr/lib/x86_64-linux-gnu/crti.o:(.text)
    0000000001fd2030 00000000000000bd    16         /usr/lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o:(.text)
    0000000001fd2030 0000000000000000     0                 deregister_tm_clones
    0000000001fd2060 0000000000000000     0                 register_tm_clones

    This format is not the same as GNU linkers as our linker internal data structure is different from them but contains the same amount of information and should be more readable than their outputs.

    As with other lld features, the -Map option is designed with speed in mind. The option would generate a hundred megabyte text file if you link a large program with it. lld can usually do that in a few seconds, and it is generally a few times faster than the GNU gold’s -Map option.

  • lld’s --gdb-index option used to be slow, but we sped it up so that it is at least as fast as the GNU gold.

  • Some nonstandard relocations, such as R_X86_64_8 or R_X86_64_16, are supported. They are not used for 32/64-bit applications, but some 16-bit bootloaders need them.

  • Paddings in executable text sections are now filled with trap instructions (such as INT3) instead of being left as null bytes. This change improves disassembler outputs because it now prints out trap instructions instead of trying to decode 0x00 as an instruction. It also makes debugging of some type of program easier because when the control reaches a padding, the program immediately raises an error.

  • The following options are added: -M, -Map, -compress-debug-sections, -emit-relocs, -error-unresolved-symbols, -exclude-libs, -filter, -no-dynamic-linker, -no-export-dynamic, -no-fatal-warnings, -print-map, -warn-unresolved-symbols, -z nocopyreloc, -z notext, -z rodynamic

Contributors to lld 5.0

We had 63 individuals contribute to lld 5.0. Thank you so much!

  • Adrian McCarthy
  • Alberto Magni
  • Alexander Richardson
  • Andre Vieira
  • Andrew Ng
  • Anton Korobeynikov
  • Bob Haarman
  • David Blaikie
  • Davide Italiano
  • David L. Jones
  • Dmitry Mikulin
  • Ed Maste
  • Ed Schouten
  • Eric Beckmann
  • Eric Fiselier
  • Eugene Leviant
  • Evgeniy Stepanov
  • Galina Kistanova
  • George Rimar
  • Hans Wennborg
  • Igor Kudrin
  • Ismail Donmez
  • Jake Ehrlich
  • James Henderson
  • Joel Jones
  • Jon Chesterfield
  • Kamil Rytarowski
  • Kevin Enderby
  • Konstantin Zhuravlyov
  • Kyungwoo Lee
  • Leslie Zhai
  • Mark Kettenis
  • Martell Malone
  • Martin Storsjo
  • Meador Inge
  • Mehdi Amini
  • Michal Gorny
  • NAKAMURA Takumi
  • Paul Robinson
  • Pavel Labath
  • Petar Jovanovic
  • Peter Collingbourne
  • Peter Smith
  • Petr Hosek
  • Rafael Espindola
  • Reid Kleckner
  • Richard Smith
  • Robert Clarke
  • Rui Ueyama
  • Saleem Abdulrasool
  • Sam Clegg
  • Sean Eveson
  • Sean Silva
  • Shankar Easwaran
  • Shoaib Meenai
  • Simon Atanasyan
  • Simon Dardis
  • Simon Tatham
  • Sylvestre Ledru
  • Tom Stellard
  • Vitaly Buka
  • Yuka Takahashi
  • Zachary Turner