LLD - The LLVM Linker
=====================

LLD is a linker from the LLVM project that is a drop-in replacement
for system linkers and runs much faster than them. It also provides
features that are useful for toolchain developers.

The linker supports ELF (Unix), PE/COFF (Windows), Mach-O (macOS) and
WebAssembly in descending order of completeness. Internally, LLD consists of
several different linkers. The ELF port is the one that will be described in
this document. The PE/COFF port is complete, including
Windows debug info (PDB) support. The WebAssembly port is still a work in
progress (See :doc:`WebAssembly`).  The Mach-O port is built based on a
different architecture than the others. For the details about Mach-O, please
read :doc:`AtomLLD`.

Features
--------

- LLD is a drop-in replacement for the GNU linkers that accepts the
  same command line arguments and linker scripts as GNU.

  We are currently working closely with the FreeBSD project to make
  LLD default system linker in future versions of the operating
  system, so we are serious about addressing compatibility issues. As
  of February 2017, LLD is able to link the entire FreeBSD/amd64 base
  system including the kernel. With a few work-in-progress patches it
  can link approximately 95% of the ports collection on AMD64. For the
  details, see `FreeBSD quarterly status report
  <https://www.freebsd.org/news/status/report-2016-10-2016-12.html#Using-LLVM%27s-LLD-Linker-as-FreeBSD%27s-System-Linker>`_.

- LLD is very fast. When you link a large program on a multicore
  machine, you can expect that LLD runs more than twice as fast as the GNU
  gold linker. Your milage may vary, though.

- It supports various CPUs/ABIs including x86-64, x86, x32, AArch64,
  ARM, MIPS 32/64 big/little-endian, PowerPC, PowerPC 64 and AMDGPU.
  Among these, x86-64, AArch64, and ARM (>= v6) are production quality.
  MIPS seems decent too. x86 should be OK but is not well tested yet.

- It is always a cross-linker, meaning that it always supports all the
  above targets however it was built. In fact, we don't provide a
  build-time option to enable/disable each target. This should make it
  easy to use our linker as part of a cross-compile toolchain.

- You can embed LLD in your program to eliminate dependencies on
  external linkers. All you have to do is to construct object files
  and command line arguments just like you would do to invoke an
  external linker and then call the linker's main function,
  ``lld::elf::link``, from your code.

- It is small. We are using LLVM libObject library to read from object
  files, so it is not a completely fair comparison, but as of February
  2017, LLD/ELF consists only of 21k lines of C++ code while GNU gold
  consists of 198k lines of C++ code.

- Link-time optimization (LTO) is supported by default. Essentially,
  all you have to do to do LTO is to pass the ``-flto`` option to clang.
  Then clang creates object files not in the native object file format
  but in LLVM bitcode format. LLD reads bitcode object files, compile
  them using LLVM and emit an output file. Because in this way LLD can
  see the entire program, it can do the whole program optimization.

- Some very old features for ancient Unix systems (pre-90s or even
  before that) have been removed. Some default settings have been
  tuned for the 21st century. For example, the stack is marked as
  non-executable by default to tighten security.

Performance
-----------

This is a link time comparison on a 2-socket 20-core 40-thread Xeon
E5-2680 2.80 GHz machine with an SSD drive. We ran gold and lld with
or without multi-threading support. To disable multi-threading, we
added ``-no-threads`` to the command lines.

============  ===========  ============  ====================  ==================  ===============  =============
Program       Output size  GNU ld        GNU gold w/o threads  GNU gold w/threads  lld w/o threads  lld w/threads
ffmpeg dbg    92 MiB       1.72s         1.16s                 1.01s               0.60s            0.35s
mysqld dbg    154 MiB      8.50s         2.96s                 2.68s               1.06s            0.68s
clang dbg     1.67 GiB     104.03s       34.18s                23.49s              14.82s           5.28s
chromium dbg  1.14 GiB     209.05s [1]_  64.70s                60.82s              27.60s           16.70s
============  ===========  ============  ====================  ==================  ===============  =============

As you can see, lld is significantly faster than GNU linkers.
Note that this is just a benchmark result of our environment.
Depending on number of available cores, available amount of memory or
disk latency/throughput, your results may vary.

.. [1] Since GNU ld doesn't support the ``-icf=all`` and
       ``-gdb-index`` options, we removed them from the command line
       for GNU ld. GNU ld would have been slower than this if it had
       these options.

Build
-----

If you have already checked out LLVM using SVN, you can check out LLD
under ``tools`` directory just like you probably did for clang. For the
details, see `Getting Started with the LLVM System
<http://llvm.org/docs/GettingStarted.html>`_.

If you haven't checked out LLVM, the easiest way to build LLD is to
check out the entire LLVM projects/sub-projects from a git mirror and
build that tree. You need `cmake` and of course a C++ compiler.

.. code-block:: console

  $ git clone https://github.com/llvm-project/llvm-project-20170507 llvm-project
  $ mkdir build
  $ cd build
  $ cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS=lld -DCMAKE_INSTALL_PREFIX=/usr/local ../llvm-project/llvm
  $ make install

Using LLD
---------

LLD is installed as ``ld.lld``. On Unix, linkers are invoked by
compiler drivers, so you are not expected to use that command
directly. There are a few ways to tell compiler drivers to use ld.lld
instead of the default linker.

The easiest way to do that is to overwrite the default linker. After
installing LLD to somewhere on your disk, you can create a symbolic
link by doing ``ln -s /path/to/ld.lld /usr/bin/ld`` so that
``/usr/bin/ld`` is resolved to LLD.

If you don't want to change the system setting, you can use clang's
``-fuse-ld`` option. In this way, you want to set ``-fuse-ld=lld`` to
LDFLAGS when building your programs.

LLD leaves its name and version number to a ``.comment`` section in an
output. If you are in doubt whether you are successfully using LLD or
not, run ``readelf --string-dump .comment <output-file>`` and examine the
output. If the string "Linker: LLD" is included in the output, you are
using LLD.

History
-------

Here is a brief project history of the ELF and COFF ports.

- May 2015: We decided to rewrite the COFF linker and did that.
  Noticed that the new linker is much faster than the MSVC linker.

- July 2015: The new ELF port was developed based on the COFF linker
  architecture.

- September 2015: The first patches to support MIPS and AArch64 landed.

- October 2015: Succeeded to self-host the ELF port. We have noticed
  that the linker was faster than the GNU linkers, but we weren't sure
  at the time if we would be able to keep the gap as we would add more
  features to the linker.

- July 2016: Started working on improving the linker script support.

- December 2016: Succeeded to build the entire FreeBSD base system
  including the kernel. We had widen the performance gap against the
  GNU linkers.

Internals
---------

For the internals of the linker, please read :doc:`NewLLD`. It is a bit
outdated but the fundamental concepts remain valid. We'll update the
document soon.

.. toctree::
   :maxdepth: 1

   NewLLD
   AtomLLD
   WebAssembly
   windows_support
   missingkeyfunction
   ReleaseNotes
