首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >找不到LLVM JIT符号

找不到LLVM JIT符号
EN

Stack Overflow用户
提问于 2019-08-22 14:57:36
回答 3查看 3K关注 0票数 5

我正试图编写一个程序来编写一些代码。JITTed代码需要对运行中的应用程序进行调用以获得运行时支持,并且在函数物化时找不到运行时支持符号。

我试着遵循万花筒教程。我需要从一些IR生成的代码中调用运行时的函数。例如,我想从某个llvm调用这个函数。

代码语言:javascript
复制
extern "C" void* llvmNewVector() {
    return new vector<int>();
}

根据万花筒教程,它应该被宣布出"C“和在运行时的应用程序。在LLVM IR中,我创建了一个函数原型,并正确地生成了IR (在检查我正在退出的函数后没有错误)。

在我看来,要将这个函数链接到跳转代码,还有更多的事情要做,但万花筒教程似乎没有这样做。

我的问题是,由于外部符号没有得到解决,所以跳码无法实现。

下面的代码打印“在这里”,但没有得到更多信息。

代码语言:javascript
复制
cerr << "made it here." << endl;
auto Sym = ExitOnErr(TheJIT->lookup(name));
NativeCodePtr FP = (NativeCodePtr)Sym.getAddress();
assert(FP && "Failed to find function ");
cerr << "returning jitted function " << name << endl;
return FP;

我肯定我做错了什么或错过了一些步骤,但我一直未能找到它。

我得到的输出是:

代码语言:javascript
复制
made it here.
JIT session error: Symbols not found: { llvmNewVector }
Failed to materialize symbols: { my_test }

代码是使用LLVM-9使用以下标志编译的:

代码语言:javascript
复制
clang++ -I. -g -I../include/ -std=c++11 -fexceptions -fvisibility=hidden -fno-rtti -D_DEBUG -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.cpp 

使用了以下链接:

代码语言:javascript
复制
llvm-config --libs
EN

回答 3

Stack Overflow用户

发布于 2020-01-09 18:23:28

我遇到了同样的问题,可以通过以下方式解决:

教程中的以下代码行(其目标是解析主机进程中的符号)似乎不起作用。

代码语言:javascript
复制
ES.getMainJITDylib().setGenerator(
    cantFail(DynamicLibrarySearchGenerator::GetForCurrentProcess(DL)));

因此,我手动注册了我想要链接的符号,如下所示:

代码语言:javascript
复制
SymbolMap M;
// Register every symbol that can be accessed from the JIT'ed code.
M[Mangle("llvmNewVector")] = JITEvaluatedSymbol(
    pointerToJITTargetAddress(&llvmNewVector), JITSymbolFlags());
}
cantFail(ES.getMainJITDylib().define(absoluteSymbols(M)));

我在教程中提到的两行代码之后添加了这段代码。

票数 3
EN

Stack Overflow用户

发布于 2020-06-23 06:03:07

为clang添加-Xlinker --export-dynamic选项如何?

我在教程中遇到了类似的问题。在我的环境(Ubuntu20.04)中,sincos可以被解析,但是printdputchard (在万花筒处理器源代码中定义的函数)不能被解析。

编译后,您能在程序的动态符号表中看到函数名吗?

代码语言:javascript
复制
objdump -T program | grep llvmNewVector

如果objdump (例如Mac)中没有-T选项,则情况可能不是这样。在我的示例中,printdputchard不出现在动态符号表中(而是出现在符号表中)。

要将这些函数名添加到动态符号表中,您需要传递clang的-Xlinker --export-dynamic选项(实际上,该选项被传递给ld),例如(这是教程中的一个),

代码语言:javascript
复制
clang++ -Xlinker --export-dynamic -g toy.cpp `llvm-config --ldflags --system-libs --libs all` -O3 -o toy

编译后,函数名出现在动态符号表中,本教程的示例运行良好。

票数 2
EN

Stack Overflow用户

发布于 2020-07-06 14:47:57

这取决于您使用哪个llvm版本。LLVM 10有LLJIT类,它对我的工作方式如下

代码语言:javascript
复制
      auto J = ExitOnErr(LLJITBuilder().create());
      auto M = createDemoModule();
    
      auto &dl = J->getDataLayout();
      MangleAndInterner Mangle(J->getExecutionSession(), dl);
      auto &jd = J->getMainJITDylib();
    
      auto s = absoluteSymbols({{ Mangle("printd"), JITEvaluatedSymbol(pointerToJITTargetAddress(&printd), JITSymbolFlags::Exported)}});
      jd.define(s);

printd函数在同一个文件中定义。

代码语言:javascript
复制
extern "C" int32_t printd() {
    std::cout << "calling " << __FUNCTION__ << "...\n";
    return 11;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57612173

复制
相关文章

相似问题

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