想尝试这个LLD来自 LLVM。 apt 上的文档可以找到这里,但我不知道哪个包包含lld
可执行文件。
看起来目的lld
是为了消除系统依赖,但 clang 没有lld
内置。 (还没有?)
使用下面的例子来测试是否lld
使用。GNU-ld
对存档文件的出现顺序施加了一些限制,但lld
似乎对此更能容忍(如果我理解正确的话),因此如果lld
使用的话,这个示例应该会成功构建。然而,它在我的盒子上失败了。
# one.c
extern int two();
int main(int argc, char *argv[])
{
two();
return 0;
}
# two.c
void two(){}
$ clang -c two.c; ar cr two.a two.o ; clang -c one.c ; clang two.a one.o
one.o: In function `main':
one.c:(.text+0x19): undefined reference to `two'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
如果我们使用-v
:
$ clang -c two.c; ar cr two.a two.o ; clang -c one.c ; clang -v two.a one.o
Ubuntu clang version 3.4-1ubuntu3 (tags/RELEASE_34/final) (based on LLVM 3.4)
Target: x86_64-pc-linux-gnu
Thread model: posix
Found candidate GCC installation: /usr/bin/../lib/gcc/i686-linux-gnu/4.9
Found candidate GCC installation: /usr/bin/../lib/gcc/i686-linux-gnu/4.9.0
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8.2
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9.0
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/4.9
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/4.9.0
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.8
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.8.2
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9.0
Selected GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8
"/usr/bin/ld" -z relro --hash-style=gnu --build-id --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o a.out /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o -L/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8 -L/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu -L/lib/x86_64-linux-gnu -L/lib/../lib64 -L/usr/lib/x86_64-linux-gnu -L/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../.. -L/lib -L/usr/lib two.a one.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/crtend.o /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o
one.o: In function `main':
one.c:(.text+0x19): undefined reference to `two'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
环境电压
Ubuntu clang 版本 3.4-1ubuntu3 (tags/RELEASE_34/final)(基于 LLVM 3.4) 目标:x86_64-pc-linux-gnu 线程模型:posix
答案1
自 2017 年 1 月以来,LLVM apt 存储库包括 lld,也是如此快照包在 Debian 中可用(从不稳定的 4.0 开始,实验性的 5.0 开始)。从版本 5 开始,lld
软件包在 Debian 中可用(lld-5.0
在Debian 9和 10中,在 Debian 9 和 10 中,以及当前正在准备的发行版中的更高版本的软件包)stretch-backports
。lld-6.0
stretch-backports
lld-7
lld-8
buster-backports
要在 Debian 或 Ubuntu 上安装上游软件包,请按照说明进行操作供您分发。
早在 2015 年 2 月最初写这个答案时,LLVM apt 存储库表示它包括 LLVM、Clang、compiler-rt、polly 和 LLDB。 lld 不包括在内。甚至最新的快照包在 Debian 中(由与 LLVM 软件包相同的团队维护)不包含 lld。
答案2
听起来,lld 还没有达到 Clang/LLVM 的成熟度,因此它没有包含在主包中。
LLVM 中的链接器存在一些混乱(我自己也很困惑)。这个答案的其余部分(虽然没有直接回答原来的问题)有助于消除混乱,以定义我们正在谈论的内容!有三种可以称为链接器:
答案3
使用Ubuntu 软件包搜索网站显示一个名为“lld-4.0”的包。还有其他软件包可能包含 lld,尤其是 Ubuntu 开发分支中的“lld-5.0”(巧妙。)
软件包“lld-4.0”安装未命名为“lld”的可执行文件。例如,它安装“lld-4.0”,一个通用驱动程序。调用它会告诉您在 Linux 上调用“ld.lld-4.0”。
在 Ubuntu 上,测试已安装的软件包:
which ld.lld-4.0
ld.lld-4.0 --version