【问题标题】:when using the llvm pass on a program, error: unable to execute command: Segmentation fault (core dumped)在程序上使用 llvm 传递时,错误:无法执行命令:分段错误(核心转储)
【发布时间】:2019-03-23 12:40:24
【问题描述】:

一个简单的 LLVM 传递示例,用于 LLVM-7.0.0。 尝试运行时出现此错误:

clang -I~/clang_llvm2/include -Xclang -load -Xclang build/skeleton/libSkeletonPass.* test/a.cpp

我看到了一个叫做 main 的函数!

...

clang-7:错误:无法执行命令:分段错误(核心转储) clang-7:错误:clang 前端命令因信号而失败(使用 -v 查看调用) clang 版本 7.0.0 (tags/RELEASE_700/final) 目标:x86_64-unknown-linux-gnu 线程模型:posix clang-7:注意:诊断消息:请向https://bugs.llvm.org/ 提交错误报告,并包括崩溃回溯、预处理源和相关的运行脚本。 clang-7:错误:无法执行命令:分段错误(核心转储) clang-7:注意:诊断消息:生成预处理源时出错。

LLVM-7.0.0 的简单 LLVM 通行证

#include "llvm/Pass.h"
#include "llvm/IR/Function.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/IR/LegacyPassManager.h"
#include "llvm/Transforms/IPO/PassManagerBuilder.h"
using namespace llvm;

namespace {
  struct SkeletonPass : public FunctionPass {
    static char ID;
    SkeletonPass() : FunctionPass(ID) {}

    bool runOnFunction(Function &F) {
      errs() << "I saw a function called " << F.getName() << "!\n";
      return false;
    }
  };
}

char SkeletonPass::ID = 0;

// Automatically enable the pass.
// http://adriansampson.net/blog/clangpass.html
static void registerSkeletonPass(const PassManagerBuilder &,
                         legacy::PassManagerBase &PM) {
  PM.add(new SkeletonPass());
}
static RegisterStandardPasses
  RegisterMyPass(PassManagerBuilder::EP_EarlyAsPossible,
                 registerSkeletonPass);

a.cpp 程序是一个简单的 hello world 程序。 LLVM_HOME 已正确设置。 使用预构建的 llvm 文件。

【问题讨论】:

    标签: compiler-errors clang llvm clang++ llvm-clang


    【解决方案1】:

    您并不孤单遇到此错误 (https://bugs.llvm.org/show_bug.cgi?id=34573),自 LLVM 5 起使用 RegisterStandardPasses 时,LLVM 似乎在程序结束时崩溃。

    根据这个答案:https://github.com/sampsyo/llvm-pass-skeleton/issues/7#issuecomment-401834287 一个解决方案是在链接程序时将-Wl,-znodelete 添加到编译器标志中。它对我有用。

    【讨论】:

      【解决方案2】:

      如果您正在开发源内通行证(在 LLVM 源代码树中),则必须从源代码编译 LLVM。在开发源外通行证的情况下,它也很方便,因为它使您可以完全控制编译选项。例如,与经过优化的版本相比,LLVM 的调试版本使用起来更愉快llvm-pass-tutorial

      我刚刚遇到了类似的问题。似乎优化的 clang 构建(从 apt installpre-built binaries 获得的那个)不支持源内传递。我目前知道的唯一选择是从源代码构建 llvm 和 clang。

      LLVM Download Page

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-19
        • 1970-01-01
        • 2019-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-13
        • 1970-01-01
        相关资源
        最近更新 更多