【问题标题】:Problems enabling RTTI in LLVM JIT-ed code在 LLVM JIT-ed 代码中启用 RTTI 的问题
【发布时间】:2019-06-21 12:53:51
【问题描述】:

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

虽然使用这两个工具链创建的 DLL 和可执行代码可以很好地混合和匹配,但我遇到了不包含 LLVM 应该自动生成的变量的 JIT-ted 代码的问题,例如 ??_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 引擎。

有人可以帮帮我吗?

【问题讨论】:

    标签: c++ llvm jit rtti


    【解决方案1】:

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

    c:/Program Files (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 编译器教程建议这样做。

    【讨论】:

    • 非常感谢您的精彩回答。我会立即落实您的建议。
    • @HiltonFernandes:如果这个答案让你找到了解决方案,那么你会想要“接受”它。有关这方面的更多信息,请从帮助站点阅读此部分:someone answers。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 2015-05-05
    相关资源
    最近更新 更多