首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将多个LLVM C++模块连接到lli中的分段故障

将多个LLVM C++模块连接到lli中的分段故障
EN

Stack Overflow用户
提问于 2013-08-25 13:31:56
回答 1查看 917关注 0票数 3

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

我尝试以下几点:

  1. clang++ -emit-llvm -c -x c++ -o main.bc -isystem -x/ main.cc
  2. clang++ -emit-llvm -c -x c++ -o test_class.bc -isystem -x/ test_class.cc
  3. llvm link main.bc test_class.bc -o all.bc
  4. lli all.bc

但是,4.失败(分段错误):

代码语言:javascript
复制
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完成编译部分,但就目前而言,了解我在这里做错了什么将是非常棒的!谢谢!

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

包括/test_class.h:

代码语言:javascript
复制
#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:

代码语言:javascript
复制
#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:

代码语言:javascript
复制
#include <cstdlib>
#include <string>
#include <iostream>

#include <test_class.h>

int main(int argc, char** argv)
{
  test_class test("foo");

  return EXIT_SUCCESS;
}
EN

回答 1

Stack Overflow用户

发布于 2013-08-25 15:16:27

test_class中,您指的是std::string。我想,如果您查看IR (例如:llvm-dis < all.bc),对相关函数的调用将被标记为llvm-dis < all.bc

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18429509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档