LLVM 缺少链接器,无法编译 lld(llvm 链接器)

Posted

技术标签:

【中文标题】LLVM 缺少链接器,无法编译 lld(llvm 链接器)【英文标题】:LLVM missing linker and can't compile the lld (llvm linker) 【发布时间】:2014-11-12 07:18:05 【问题描述】:

我想为一个新目标构建一个编译器,我选择了 llvm。据我了解,我可以使用clang项目作为前端,llvm作为后端。我可以从 llc(llvm 的一部分)中获取 .o 文件。现在我需要将它们全部链接到可执行文件中。我尝试使用 lld 项目,但编译失败并出现错误:

Desktop/llvm_project/llvm/lib/Target/ARM/ARMISelLowering.cpp: In member function ‘llvm::Instruction* llvm::ARMTargetLowering::makeDMB(llvm::IRBuilder<>&, llvm::ARM_MB::MemBOpt) const’:
Desktop/llvm_project/llvm/lib/Target/ARM/ARMISelLowering.cpp:11000:73: error: could not convert ‘(& Builder)->llvm::IRBuilder<>::<anonymous>.llvm::IRBuilderBase::getInt32(15u), (& Builder)->llvm::IRBuilder<>::<anonymous>.llvm::IRBuilderBase::getInt32(0u), (& Builder)->llvm::IRBuilder<>::<anonymous>.llvm::IRBuilderBase::getInt32(0u), (& Builder)->llvm::IRBuilder<>::<anonymous>.llvm::IRBuilderBase::getInt32(7u), (& Builder)->llvm::IRBuilder<>::<anonymous>.llvm::IRBuilderBase::getInt32(10u), (& Builder)->llvm::IRBuilder<>::<anonymous>.llvm::IRBuilderBase::getInt32(5u)’ from ‘<brace-enclosed initializer list>’ to ‘llvm::ArrayRef<llvm::Value*>’
                                Builder.getInt32(10), Builder.getInt32(5);
                                                                         ^
make[2]: *** [lib/Target/ARM/CMakeFiles/LLVMARMCodeGen.dir/ARMISelLowering.cpp.o] Error 1
make[1]: *** [lib/Target/ARM/CMakeFiles/LLVMARMCodeGen.dir/all] Error 2
make: *** [all] Error 2

所以我有几个问题,因为我认为我遗漏了一些东西:

    如果我没有用于新目标的 binutils,我应该如何使用 llvm 项目? - 他们创造了他们伟大的项目......但没有实际创建运行文件的最后一块?!我应该使用什么作为链接器? 有人遇到过这个 lld 构建错误并解决了吗?

uname -a

Linux my_name-Inspiron-3521 3.13.0-35-generic #62-Ubuntu SMP Fri Aug 15 01:58:42 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

gcc -v

使用内置规范。 COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper 目标:x86_64-linux-gnu 配置:../src/configure -v --with-pkgversion='Ubuntu 4.8.2-19ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java, go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without -included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ - -enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --禁用浏览器插件 --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre - -enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm -exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-l ist=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu 线程模型: posix gcc 版本 4.8.2 (Ubuntu 4.8.2-19ubuntu1)

【问题讨论】:

【参考方案1】:

您遇到的错误是在 llvm 本身,而不是 lld。我在buildbots 上没有看到该错误,因此我建议更新您的源代码树。

至于 binutils,llvm 目前并没有提供完整的替代品。这项工作正在进行中,但完成之前还需要一段时间。现在我建议使用带有 ld 或 gold 作为链接器的 gnu binutils。

【讨论】:

如果我在没有 ld 项目的情况下构建 llvm,它可以工作。添加 ld 项目时出现上述错误。

以上是关于LLVM 缺少链接器,无法编译 lld(llvm 链接器)的主要内容,如果未能解决你的问题,请参考以下文章

在 Ubuntu 16.04 上构建 LLVM 6 主干不构建 lld

如何使用 LLVM 在 Windows 上为 ARM 编译 C++ 程序?

Xcode 5“缺少编译器规范 LLVM 4.2”错误

使用 LLVM ExecutionEngine 调用 Objective-C 方法时,所有选择器都无法识别

llvm linker(lld) mapfile格式说明

xcode 4.6 目标构建设置缺少“Apple LLVM 编译器 4.2 - ...”部分