| # LLD for Mac builds |
| |
| Like on other platforms, Chromium uses the LLD linker on iOS and macOS. |
| |
| ## Background |
| |
| Chromium uses [LLD](https://lld.llvm.org/) as linker on all platforms. |
| LLD is faster than other ELF linkers (ELF |
| is the executable file format used on most OSs, including Linux, Android, |
| Chrome OS, Fuchsia), and it's faster than other COFF linkers (the executable |
| file format on Windows). |
| |
| LLD is currently twice as fast as ld64, the macOS system linker, at linking |
| Chromium Framework in symbol\_level=0 release builds, despite ld64 being already |
| fast. (Before Xcode 14.1, LLD was 6x as fast as ld64.) |
| |
| LLD has advantages unrelated to speed, too: |
| |
| - It's developed in the LLVM repository, and we ship it in our clang package. |
| We can fix issues upstream and quickly deploy fixed versions, instead of |
| having to wait for Xcode releases (which is where ld64 ships). |
| |
| - For the same reason, it has a much simpler LTO setup: Clang and LLD both link |
| in the same LLVM libraries that are built at the same revision, and compiler |
| and linker bitcodes are interopable for that reason. With ld64, the LTO code |
| has to be built as a plugin that's loaded by the linker. |
| |
| - LLD/Mach-O supports "LLVM-y" features that the ELF and COFF LLDs support as |
| well, such as thin archives, colored diagnostics, and response files |
| (ld64 supports this too as of Xcode 12, but we had to wait many years for it, |
| and it's currently [too crashy](https://crbug.com/1147968) to be usable). |
| |
| - While LLD for ELF, LLD for COFF, and LLD for MachO are mostly independent |
| codebases, they all use LLVM libraries. That gives them similar behavior. |
| Using LLD unifies the build across platforms somewhat. |
| |
| For that reason, we moved to LLD for iOS and macOS builds. |
| |
| Just like the LLD ELF port tries to be commandline-compatible with other ELF |
| linkers and the LLD COFF port tries to be commandline-compatible with the |
| Visual Studio linker link.exe, the LLD Mach-O port tries to be |
| commandline-compatible with ld64. This means LLD accepts different flags on |
| different platforms. |
| |
| ## Current status and known issues |
| |
| LLD is used by default in all build configurations. |
| All tests on all bots are passing, both Intel and Arm. |
| Most things even work. |
| |
| ## Hacking on LLD |
| |
| If you want to work on LLD, follow [this paragraph](clang.md#Using-a-custom-clang-binary). |
| |
| ## Creating stand-alone repros for bugs |
| |
| For simple cases, LLD's `--reproduce=foo.tar` flag / `LLD_REPRODUCE=foo.tar` |
| env var is sufficient. |
| |
| See "Note to self:" [here](https://bugs.llvm.org/show_bug.cgi?id=48657#c0) for |
| making a repro file that involved the full app and framework bundles. |