在LLVM JIT版本的代码中启用RTTI的问题

时间:2019-01-28 13:46:43

标签: c++ llvm jit rtti

我是Windows应用程序中的JIT-ting C ++代码。我正在使用LLVM / CLang 5.0,并且该应用程序是使用MsVc 2015编译的。

虽然使用这两个工具链创建的DLL和可执行代码很好地混合和匹配,但是我遇到了JIT编码的问题,这些编码不包含LLVM应该自动生成的变量,例如??_7type_info@@6B@和相关联的变量诸如\01??_R0H@8之类的东西。它们仅作为外部注册,使用它们会导致应用程序崩溃

LLVM ERROR: Program used external function '??_7type_info@@6B@' which could not be resolved!

虽然我找到了将用户定义的变量添加到JIT TED代码中的示例,但我找不到有效的解决方案来解决使JIT代码引用这些内部变量的问题,这些问题是在幕后产生的。

我相信我可以通过用.ll进行调整而用CLang编译的DLL提供缺少的变量,但是我更喜欢更清洁的解决方案,只需配置JIT-ter引擎即可。

请问有人可以帮我吗?

1 个答案:

答案 0 :(得分:2)

?? _ 7type_info @@ 6B @是std :: type_info类的vtable的错误名称,由隐式链接的一个或其他MSVC静态库提供,例如:

c:/程序文件(x86)/ Microsoft Visual Studio / 2017 / Professional / VC / Tools / MSVC / 14.15.26726 / lib / x64 / msvcrt.lib

要解决LLVM查找错误,您可以从您自己的DLL或EXE中导出该符号,实际上您可以从C ++代码中执行以下操作:

#pragma comment(linker, "/export:??_7type_info@@6B@")

另请参阅https://docs.microsoft.com/en-us/cpp/build/reference/export-exports-a-function?view=vs-2017

您可能还必须调用以下实用程序功能,以确保LLVM可以看到所有符号

llvm :: sys :: DynamicLibrary :: LoadLibraryPermanently(nullptr);

不确定在这种情况下是否绝对必要,但是LLVM JIT编译器教程建议这样做。