Mach-O LLD Port

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. This document will describe the Mach-O port.

Features

  • LLD is a drop-in replacement for Apple’s Mach-O linker, ld64, that accepts the same command line arguments.
  • 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 ld64 linker.

Download

LLD is available as a pre-built binary by going to the latest release, downloading the appropriate bundle (clang+llvm-<version>-<your architecture>-<your platform>.tar.xz), decompressing it, and locating the binary at bin/ld64.lld. Note that if ld64.lld is moved out of bin, it must still be accompanied by its sibling file lld, as ld64.lld is technically a symlink to lld.

Build

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.

$ git clone https://github.com/llvm/llvm-project llvm-project
$ mkdir build
$ cd build
$ cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS='lld' ../llvm-project/llvm
$ ninja check-lld-macho

Then you can find output binary at build/bin/ld64.lld. Note that if ld64.lld is moved out of bin, it must still be accompanied by its sibling file lld, as ld64.lld is technically a symlink to lld.

Using LLD

LLD can be used by adding -fuse-ld=/path/to/ld64.lld to the linker flags. For Xcode, this can be done by adding it to “Other linker flags” in the build settings. For Bazel, this can be done with --linkopt or with rules_apple_linker. The user may also need to add -Wl,--deduplicate-literals in order to match Apple’s linker behavior more closely (otherwise problems can occur, for instance, in unit tests).

See also

ld64 vs LLD-MachO has more info on the differences between the two linkers.