【问题标题】:Fatal Error building the llvm source code in Ubuntu在 Ubuntu 中构建 llvm 源代码的致命错误
【发布时间】:2017-12-02 02:51:52
【问题描述】:

我正在尝试在 Ubuntu 16.04 上构建 LLVM 源代码。我已经使用来自here 的源尝试了 4.0.1、4.0.0 和 3.9.0 版本。我也尝试过使用来自 svn 的源代码,如几个教程中所示。

这是我得到的错误:

[1480/1747] Linking CXX executable bin/clang-3.9
FAILED: : && /usr/bin/c++   -fPIC -fvisibility-inlines-hidden -Wall -W -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wno-missing-field-initializers -pedantic -Wno-long-long -Wno-maybe-uninitialized -Wdelete-non-virtual-dtor -Wno-comment -Werror=date-time -std=c++11 -fno-common -Woverloaded-virtual -fno-strict-aliasing -g  -Wl,-allow-shlib-undefined   -Wl,--export-dynamic tools/clang/tools/driver/CMakeFiles/clang.dir/driver.cpp.o tools/clang/tools/driver/CMakeFiles/clang.dir/cc1_main.cpp.o tools/clang/tools/driver/CMakeFiles/clang.dir/cc1as_main.cpp.o  -o bin/clang-3.9  lib/libLLVMAArch64CodeGen.a lib/libLLVMAArch64AsmPrinter.a lib/libLLVMAArch64AsmParser.a lib/libLLVMAArch64Desc.a lib/libLLVMAArch64Info.a lib/libLLVMAArch64Disassembler.a lib/libLLVMAMDGPUCodeGen.a lib/libLLVMAMDGPUAsmPrinter.a lib/libLLVMAMDGPUAsmParser.a lib/libLLVMAMDGPUDesc.a lib/libLLVMAMDGPUInfo.a lib/libLLVMAMDGPUDisassembler.a lib/libLLVMARMCodeGen.a lib/libLLVMARMAsmPrinter.a lib/libLLVMARMAsmParser.a lib/libLLVMARMDesc.a lib/libLLVMARMInfo.a lib/libLLVMARMDisassembler.a lib/libLLVMBPFCodeGen.a lib/libLLVMBPFAsmPrinter.a lib/libLLVMBPFDesc.a lib/libLLVMBPFInfo.a lib/libLLVMHexagonCodeGen.a lib/libLLVMHexagonAsmParser.a lib/libLLVMHexagonDesc.a lib/libLLVMHexagonInfo.a lib/libLLVMHexagonDisassembler.a lib/libLLVMMipsCodeGen.a lib/libLLVMMipsAsmPrinter.a lib/libLLVMMipsAsmParser.a lib/libLLVMMipsDesc.a lib/libLLVMMipsInfo.a lib/libLLVMMipsDisassembler.a lib/libLLVMMSP430CodeGen.a lib/libLLVMMSP430AsmPrinter.a lib/libLLVMMSP430Desc.a lib/libLLVMMSP430Info.a lib/libLLVMNVPTXCodeGen.a lib/libLLVMNVPTXAsmPrinter.a lib/libLLVMNVPTXDesc.a lib/libLLVMNVPTXInfo.a lib/libLLVMPowerPCCodeGen.a lib/libLLVMPowerPCAsmPrinter.a lib/libLLVMPowerPCAsmParser.a lib/libLLVMPowerPCDesc.a lib/libLLVMPowerPCInfo.a lib/libLLVMPowerPCDisassembler.a lib/libLLVMSparcCodeGen.a lib/libLLVMSparcAsmPrinter.a lib/libLLVMSparcAsmParser.a lib/libLLVMSparcDesc.a lib/libLLVMSparcInfo.a lib/libLLVMSparcDisassembler.a lib/libLLVMSystemZCodeGen.a lib/libLLVMSystemZAsmPrinter.a lib/libLLVMSystemZAsmParser.a lib/libLLVMSystemZDesc.a lib/libLLVMSystemZInfo.a lib/libLLVMSystemZDisassembler.a lib/libLLVMX86CodeGen.a lib/libLLVMX86AsmPrinter.a lib/libLLVMX86AsmParser.a lib/libLLVMX86Desc.a lib/libLLVMX86Info.a lib/libLLVMX86Disassembler.a lib/libLLVMXCoreCodeGen.a lib/libLLVMXCoreAsmPrinter.a lib/libLLVMXCoreDesc.a lib/libLLVMXCoreInfo.a lib/libLLVMXCoreDisassembler.a lib/libLLVMAnalysis.a lib/libLLVMCodeGen.a lib/libLLVMCore.a lib/libLLVMipo.a lib/libLLVMInstCombine.a lib/libLLVMInstrumentation.a lib/libLLVMMC.a lib/libLLVMMCParser.a lib/libLLVMObjCARCOpts.a lib/libLLVMOption.a lib/libLLVMScalarOpts.a lib/libLLVMSupport.a lib/libLLVMTransformUtils.a lib/libLLVMVectorize.a -lpthread lib/libclangBasic.a lib/libclangCodeGen.a lib/libclangDriver.a lib/libclangFrontend.a lib/libclangFrontendTool.a lib/libPolly.a lib/libLLVMGlobalISel.a lib/libLLVMAArch64Desc.a lib/libLLVMAArch64AsmPrinter.a lib/libLLVMAArch64Info.a lib/libLLVMAArch64Utils.a lib/libLLVMAMDGPUDesc.a lib/libLLVMAMDGPUAsmPrinter.a lib/libLLVMAMDGPUInfo.a lib/libLLVMAMDGPUUtils.a lib/libLLVMARMDesc.a lib/libLLVMARMAsmPrinter.a lib/libLLVMARMInfo.a lib/libLLVMBPFAsmPrinter.a lib/libLLVMHexagonDesc.a lib/libLLVMHexagonInfo.a lib/libLLVMMipsAsmPrinter.a lib/libLLVMMipsInfo.a lib/libLLVMMSP430AsmPrinter.a lib/libLLVMNVPTXAsmPrinter.a lib/libLLVMPowerPCAsmPrinter.a lib/libLLVMPowerPCInfo.a lib/libLLVMSparcAsmPrinter.a lib/libLLVMSparcInfo.a lib/libLLVMSystemZDesc.a lib/libLLVMSystemZAsmPrinter.a lib/libLLVMSystemZInfo.a lib/libLLVMX86AsmPrinter.a lib/libLLVMX86Utils.a lib/libLLVMX86Info.a lib/libLLVMXCoreAsmPrinter.a lib/libLLVMAsmPrinter.a lib/libLLVMDebugInfoCodeView.a lib/libLLVMSelectionDAG.a lib/libLLVMCodeGen.a lib/libLLVMXCoreInfo.a lib/libLLVMMCDisassembler.a lib/libclangCodeGen.a lib/libLLVMipo.a lib/libLLVMVectorize.a lib/libLLVMInstrumentation.a lib/libLLVMObjCARCOpts.a lib/libLLVMScalarOpts.a lib/libLLVMInstCombine.a lib/libLLVMTarget.a lib/libLLVMBitWriter.a lib/libLLVMIRReader.a lib/libLLVMAsmParser.a lib/libLLVMLinker.a lib/libLLVMTransformUtils.a lib/libLLVMAnalysis.a lib/libLLVMCoverage.a lib/libLLVMObject.a lib/libclangRewriteFrontend.a lib/libclangARCMigrate.a lib/libclangStaticAnalyzerFrontend.a lib/libclangFrontend.a lib/libclangDriver.a lib/libLLVMOption.a lib/libLLVMProfileData.a lib/libclangParse.a lib/libLLVMMCParser.a lib/libclangSerialization.a lib/libLLVMBitReader.a lib/libclangSema.a lib/libclangEdit.a lib/libclangStaticAnalyzerCheckers.a lib/libclangStaticAnalyzerCore.a lib/libclangAnalysis.a lib/libclangAST.a lib/libclangRewrite.a lib/libclangLex.a lib/libclangBasic.a lib/libLLVMCore.a lib/libLLVMMC.a lib/libLLVMSupport.a -lrt -ldl -ltinfo -lpthread -lz -lm lib/libPollyISL.a -Wl,-rpath,"\$ORIGIN/../lib" && :
collect2: fatal error: ld terminated with signal 9 [Killed]

这是我尝试过的所有三个版本中反复出现的错误,因此我可能缺少某些步骤或其他一些问题。

这些是我的步骤:

  1. 下载 llvm。
  2. 下载 clang、lld 和 polly 并放入 llvm/tools。
  3. 下载 compiler-rt、openmp、libcxx、libcxxabi 和 test-suite 并放入 llvm/projects
  4. 运行cmake -G Ninja -DLLVM_ENABLE_ASSERTIONS=On ..
  5. 运行ninja -j4

我不知道如何消除此错误,并且对 LLVM 没有任何经验。请解释错误的原因。

【问题讨论】:

标签: ubuntu clang llvm llvm-clang ninja


【解决方案1】:

我尝试了所有方法,我正在使用 SSD,因此不需要交换空间。这个命令对我有用 -DLLVM_USE_LINKER=gold

【讨论】:

    【解决方案2】:

    这可能是由于链接步骤使用了太多内存造成的。在我的系统上启用了足够的交换空间,这使得系统实际上无法使用,因为交换空间位于 HDD 上。否则,Linux 内核将根据启发式终止某些进程,这可能涉及追踪最大的内存用户,这可以解释您的问题(ld 被终止)。

    如果您有大约 8 GB 的 RAM,则最多可以并行完成一个链接作业。默认情况下,llvm 是使用静态库构建的,这会导致链接占用过多的内存(由于调试信息而导致的 AFAIR)。然后通常会由 ninja 并行链接几个大型可执行文件,您的系统将耗尽内存。

    尝试将 -DLLVM_PARALLEL_LINK_JOBS=1 添加到您的 cmake 调用中。

    还有一个构建共享库的选项可以缓解这个问题,我认为是-DLLVM_LINK_LLVM_DYLIB=true

    有关 CMake 选项的更多信息,请参阅:http://llvm.org/docs/CMake.html

    我认为使用黄金链接器也有帮助,因为它比默认链接器更有效。它通过将 -DLLVM_USE_LINKER=gold 传递给 cmake 来启用。

    最后,release build不包含debug信息,占用大量内存,所以build应该占用更少的内存。

    更新: 我最近遇到了this article,它以 LLVM 为例描述了如何使用 split dwarf 来加速编译。这通过将调试信息与被链接的目标文件分开来帮助链接器的内存消耗。 对于 LLVM,split dwarf 通过将选项 -DLLVM_USE_SPLIT_DWARF=ON 传递给 cmake 来启用。

    【讨论】:

    • 我在网上查看了更多信息,人们说创建更多交换空间也应该有所帮助。我有 5.4G 的交换空间和 8G 的 RAM。够了吗?
    • 上次在笔记本电脑上尝试时,我可以使用 8 GB 的 RAM 构建,但我将作业限制为 1 并且使用的是黄金链接器。那时我不知道有选择地设置链接作业的数量,这样更快,因为编译可以并行进行。
    • 我在构建 LLVM 时进行交换的经验是,我的系统变得完全无法使用。几个小时后我不得不关掉它。所以我不建议只依赖交换空间。构建(如果完成)可能需要几天时间。
    • 如何使用黄金链接器?
    • 尝试将 -DCMAKE_EXE_LINKER_FLAGS='-fuse-ld=/usr/bin/gold' 添加到 cmake 调用中。我现在无法检查 cmake 调用,但是使用 -fuse-ld=linker 你告诉 g++ 使用“链接器”作为链接器。 Cmake 将使用编译器作为链接器以确保运行时正确链接,然后它将使用正确的参数调用链接器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 2019-07-04
    • 1970-01-01
    • 2016-01-09
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多