clang - 如何使用 lld 链接使用 clang -flto 编译的文件?

标签 clang llvm lld

我正在尝试使用 llvm-lld 链接已使用 -flto 编译的对象。

我在路径调用 lld 中有 ld 以及提供的所有参数。 我创建了一个简单的 C++ 程序,我用 clang++ 编译它:

#include <stdio.h>
int main() {
    printf("Goodbye cruel world\n");
    return 0;
}

没有 -flto 标志我得到一个可执行文件,有 -flto 我得到这个错误:

warning: ignoring unknown argument: -plugin
warning: ignoring unknown argument: -plugin-opt=mcpu=x86-64
Cannot open /tmp/a-f1a2a7.o: Exec format error
clang-3.8: error: linker command failed with exit code 1 (use -v to see invocation)

这是传递给链接器的参数,我看到使用 -flto 提供的插件参数包括此插件选项,但它似乎不受支持。

--eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o a.out /usr/lib64/gcc/x86_64-pc-linux-gnu/5.2.0/../../../../lib64/crt1.o /usr/lib64/gcc/x86_64-pc-linux-gnu/5.2.0/../../../../lib64/crti.o /usr/lib64/gcc/x86_64-pc-linux-gnu/5.2.0/crtbegin.o -L/usr/lib64/gcc/x86_64-pc-linux-gnu/5.2.0 -L/usr/lib64/gcc/x86_64-pc-linux-gnu/5.2.0/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib64/gcc/x86_64-pc-linux-gnu/5.2.0/../../../../x86_64-pc-linux-gnu/lib -L/usr/lib64/gcc/x86_64-pc-linux-gnu/5.2.0/../../.. -L/mnt/data/tmp/dev/llvm/prev/bin/../lib -L/lib -L/usr/lib -plugin /mnt/data/tmp/dev/llvm/prev/bin/../lib/LLVMgold.so -plugin-opt=mcpu=x86-64 /tmp/a-f1a2a7.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib64/gcc/x86_64-pc-linux-gnu/5.2.0/crtend.o /usr/lib64/gcc/x86_64-pc-linux-gnu/5.2.0/../../../../lib64/crtn.o

有没有办法让 lld 链接这段代码?

最佳答案

是的,您可以使用通过插件支持 LTO 的 gold-linker 来实现:

Here is the instructions how to build and run it

关于clang - 如何使用 lld 链接使用 clang -flto 编译的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32237647/

相关文章:

c++ - 如何使用Clang CompilerInstance完成?

c# - 用于优化性能的 C++ 虚拟机

c++ - 我可以使用 LLVM(低级虚拟机)为什么平台编译二进制文件?

rust - 如何更改默认的 rustc/Cargo 链接器?

c++ - 如何在 Windows 上将 lld 与 CMake 一起使用?

format - .clang-format 有没有办法在一行函数之前中断?

c++ - 获取 clang 的 AST 背后的源代码

c++ - 使用 Qt 内存管理时对 clang 静态分析的误报

c++ - LLVM中直接跳转的分支指令

c++ - 如何为 LLVM lld 提供共享库路径?