将几个LLVM C ++模块链接到lli中的段错误

时间:2013-08-25 13:31:57

标签: c++ clang llvm llvm-clang llvm-ir

我正在尝试使用LLVM / clang的一个非常简单的示例,但似乎失败了。

我尝试以下方法:

  1. clang ++ -emit-llvm -c -x c ++ -o main.bc -isystem include / main.cc
  2. clang ++ -emit-llvm -c -x c ++ -o test_class.bc -isystem include / test_class.cc
  3. llvm-link main.bc test_class.bc -o all.bc
  4. lli all.bc
  5. 然而,4。失败(段错误):

    0  libLLVM-3.3.so  0x0000003b890f9e52 llvm::sys::PrintStackTrace(_IO_FILE*) + 34
    1  libLLVM-3.3.so  0x0000003b890f9cb9
    2  libpthread.so.0 0x0000003b8520efa0
    3  libLLVM-3.3.so  0x0000003b89982790 llvm::MachineJumpTableInfo::getEntrySize(llvm::DataLayout const&) const + 0
    4  libLLVM-3.3.so  0x0000003b894bfb23
    5  libLLVM-3.3.so  0x0000003b894c8dc3
    6  libLLVM-3.3.so  0x0000003b8981b27f
    7  libLLVM-3.3.so  0x0000003b8969d2d6 llvm::FPPassManager::runOnFunction(llvm::Function&) + 422
    8  libLLVM-3.3.so  0x0000003b8969d3f6 llvm::FunctionPassManagerImpl::run(llvm::Function&) + 102
    9  libLLVM-3.3.so  0x0000003b8969d4cb llvm::FunctionPassManager::run(llvm::Function&) + 91
    10 libLLVM-3.3.so  0x0000003b894b3264 llvm::JIT::jitTheFunction(llvm::Function*, llvm::MutexGuard const&) + 36
    11 libLLVM-3.3.so  0x0000003b894b394f llvm::JIT::runJITOnFunctionUnlocked(llvm::Function*, llvm::MutexGuard const&) + 15
    12 libLLVM-3.3.so  0x0000003b894b3b7e llvm::JIT::getPointerToFunction(llvm::Function*) + 254
    13 libLLVM-3.3.so  0x0000003b894c6649
    14 libLLVM-3.3.so  0x0000003b894c909c
    15 libLLVM-3.3.so  0x0000003b8981b27f
    16 libLLVM-3.3.so  0x0000003b8969d2d6 llvm::FPPassManager::runOnFunction(llvm::Function&) + 422
    17 libLLVM-3.3.so  0x0000003b8969d3f6 llvm::FunctionPassManagerImpl::run(llvm::Function&) + 102
    18 libLLVM-3.3.so  0x0000003b8969d4cb llvm::FunctionPassManager::run(llvm::Function&) + 91
    19 libLLVM-3.3.so  0x0000003b894b3264 llvm::JIT::jitTheFunction(llvm::Function*, llvm::MutexGuard const&) + 36
    20 libLLVM-3.3.so  0x0000003b894b394f llvm::JIT::runJITOnFunctionUnlocked(llvm::Function*, llvm::MutexGuard const&) + 15
    21 libLLVM-3.3.so  0x0000003b894b3b7e llvm::JIT::getPointerToFunction(llvm::Function*) + 254
    22 lli             0x00000000004073cf main + 2527
    23 libc.so.6       0x0000003b84621b75 __libc_start_main + 245
    24 lli             0x000000000040a271
    Stack dump:
    0.      Program arguments: lli all.bc 
    1.      Running pass 'X86 Machine Code Emitter' on function '@main'
    2.      Running pass 'X86 Machine Code Emitter' on function '@_ZN10test_classC2ESs'
    [1]    15327 segmentation fault (core dumped)  lli all.bc
    

    我对这应该如何运作有一个基本的误解吗?我的最终目标是进行编译 部分使用libclang API,但现在了解我做错了什么会很棒!谢谢!

    我附上了以下示例的源代码:

    包括/ test_class.h:

    #ifndef __TEST_CLASS_H__
    #define __TEST_CLASS_H__
    
    #include <string>
    #include <iostream>
    
    struct test_class
    {
      test_class(std::string foo);
      ~test_class();
    
      std::string foo;
    };
    
    #endif
    

    test_class.cc:

    #include <test_class.h>
    
    test_class::test_class(std::string foo) : foo(foo)
    {
      std::cout << foo << std::endl;
    }
    
    test_class::~test_class(void)
    {
    }
    

    main.cc:

    #include <cstdlib>
    #include <string>
    #include <iostream>
    
    #include <test_class.h>
    
    int main(int argc, char** argv)
    {
      test_class test("foo");
    
      return EXIT_SUCCESS;
    }
    

1 个答案:

答案 0 :(得分:0)

test_class中,您引用了std::string。我,如果您查看IR(例如:external),对相关函数的调用会标记为llvm-dis < all.bc

如果编译为“普通”可执行代码,则链接器将解析这些调用。 由于您使用llvm-link手动链接,因此必须为C ++库提供IR代码,否则执行可能会失败。