blob: 8a8d1efd7fcbb07d605fede585a19c23c337543a [file] [view] [edit]
# 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](https://github.com/llvm/llvm-project/releases),
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.
```console
$ 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](https://github.com/keith/rules_apple_linker).
:::{seealso}
{doc}`ld64-vs-lld` has more info on the differences between the two linkers.
:::
```{toctree}
:hidden: true
ld64-vs-lld
```