包含 llvm 链接器 lld 的 ubuntu 软件包的名称是什么

包含 llvm 链接器 lld 的 ubuntu 软件包的名称是什么

想尝试这个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-backportslld-6.0stretch-backportslld-7lld-8buster-backports

要在 Debian 或 Ubuntu 上安装上游软件包,请按照说明进行操作供您分发

早在 2015 年 2 月最初写这个答案时,LLVM apt 存储库表示它包括 LLVM、Clang、compiler-rt、polly 和 LLDB。 lld 不包括在内。甚至最新的快照包在 Debian 中(由与 LLVM 软件包相同的团队维护)不包含 lld。

答案2

听起来,lld 还没有达到 Clang/LLVM 的成熟度,因此它没有包含在主包中。

LLVM 中的链接器存在一些混乱(我自己也很困惑)。这个答案的其余部分(虽然没有直接回答原来的问题)有助于消除混乱,以定义我们正在谈论的内容!有三种可以称为链接器:

  1. LLVM-LD- 这听起来像是 LLVM 位文件和可执行二进制目标文件的链接器。但是,那在这里回答(并提供了链接)表明 lld 已在 LLVM 3.2 中被删除。此时,没有替代链接器,必须使用系统 ld 链接器。
  2. llvm-链接- 这是 LLVM 位文件的当前链接器。
  3. LLD- 这听起来像是 ld 的积极开发的替代品,仅链接可执行二进制目标文件。这个答案在这里表明它在 2014 年 5 月正在积极开发中。它被列在主目录中LLVM项目列表如#13。我猜它只会随着时间的推移而变得更好,并且成熟到可以包含在主 LLVM 包中作为 GNU ld / gold 的替代品的程度。

答案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

相关内容