ld.lld是LLVM的ELF链接器,默认用于Linux等类Unix系统,原生支持x86_64/aarch64/riscv64,兼容大部分GNU ld选项;lld-link专用于Windows PE/COFF;ld64.lld是macOS Mach-O的实验性链接器。

ld.lld 用于 Linux 和类 Unix 系统(ELF 目标)
这是 lld 的默认主程序名,在 Linux、FreeBSD、OpenBSD 等 ELF 平台直接调用 ld.lld 即可。它原生支持 x86_64、aarch64、riscv64 等常见 ABI,能处理标准的 .o、.a、.so 文件和链接脚本。ld.lld 不依赖系统 ld 或 GNU binutils,但会识别并兼容大部分 ld 命令行选项(如 -L、-l、--gc-sections)。实际构建中,Clang 默认在 Linux 上用 ld.lld 替代 ld,只需加 -fuse-ld=lld。
lld-link 专为 Windows MSVC 兼容环境设计(PE/COFF 目标)
lld-link 是 lld 针对 Windows PE/COFF 格式实现的独立前端,行为高度贴近 Microsoft link.exe。它接受 /OUT:、/LIBPATH:、/DEFAULTLIB: 等 MSVC 风格参数,能直接消费 Clang 生成的 COFF .obj 和 MSVC 的 .lib(包括导入库)。关键点:lld-link 不读取 GNU 风格的 -L/-l,也不支持链接脚本;若混用 -L/usr/lib 这类参数,会报错 unknown argument: '-L'。在 CMake 中启用需设 CMAKE_LINKER=lld-link 或 -DCMAKE_EXE_LINKER_FLAGS="/LINKER:lld-link"。
ld64.lld 是 macOS 上的实验性替代品(Mach-O 目标)
苹果官方 ld64 是 macOS 唯一被 fully supported 的链接器,ld64.lld 并非标准安装项,而是 LLVM 社区为 Mach-O 格式做的实验性后端,目前仍由社区维护,未被 Xcode 或 Apple 工具链集成。它能解析 .o 和 .dylib,但对 __TEXT,__entitlements、代码签名、LC_LOAD_DYLIB 的弱符号绑定等 macOS 特有机制支持不完整。真实项目中硬切到 ld64.lld 容易触发 ld64.lld: error: unknown load command LC_BUILD_VERSION 或符号未定义(尤其涉及 Swift 运行时或 Objective-C 类列表时)。除非你明确在做 Mach-O 格式研究或调试 lld 本身,否则不应在生产构建中启用。
容易被忽略的一点:这三个名字不是“同一程序的不同编译产物”,而是 lld 内部针对不同目标格式(ELF / COFF / Mach-O)分别实现的三个独立链接器逻辑,共享核心算法但不共用文件解析或重定位代码。这意味着跨平台 CI 中不能简单替换二进制名——必须按目标平台选对入口点,且参数风格必须匹配。

















