LLVM即时编译代码中启用RTTI的问题

4
在Windows应用程序中,我正在对C++代码进行JIT编译。我使用的是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代码中的示例,但我无法找到有效的解决方案来使JIT代码引用这些在幕后生成的内部变量。

我相信可以通过使用CLang编译的DLL并进行调整.ll来提供缺失的变量,但我更希望有一个更清晰的解决方案,仅配置JIT-ter引擎即可。

请问有人能帮助我吗?

1个回答

2

“??_7type_info@@6B@”是std::type_info类的虚函数表的名称,由MSVC静态库之一提供并被隐式链接。例如:

c:/Program Files (x86)/Microsoft Visual Studio/2017/Professional/VC/Tools/MSVC/14.15.26726/lib/x64/msvcrt.lib

为了解决LLVM查找错误,您可以从自己的DLL或EXE中导出此符号,并且您实际上可以通过C++代码来执行此操作:

Original Answer翻译成“最初的回答”

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

参见https://learn.microsoft.com/en-us/cpp/build/reference/export-exports-a-function?view=vs-2017
您可能还需要调用下面的实用程序函数,以确保LLVM可以看到您的所有符号。 llvm::sys::DynamicLibrary::LoadLibraryPermanently(nullptr);
在这种情况下不确定是否必须进行此操作,但LLVM JIT编译器教程建议这样做。

非常感谢您给出的优秀答案。我会立即实施您的建议。 - Hilton Fernandes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接