如何解析基于 LLVM MCJIT 的 JIT 中的当前进程符号?

How to resolve current process symbols in LLVM MCJIT based JIT?

我正在创建一个简单的基于 MCJIT 的 JIT(更准确地说,实施 Kaleidoscope tutorial in Rust)。我正在使用 SectionMemoryManager::getSymbolAddress 进行符号解析。它从库中看到符号(例如 sin 函数),但无法解析我程序中的函数(全局的,用 nm 可见,用 T 标记)。这是预期的行为吗?还是我的代码有错误?

如果这是预期的行为,我应该如何正确解析当前进程中的符号?我现在正在使用 LLVMAddSymbol 从进程中添加符号,因此分辨率开始起作用。这是正确的解决方案吗?

对于那些会阅读我的代码的人。符号的问题与名称修改无关,因为当我试图使 SectionMemoryManager::getSymbolAddress 工作时,我使用了 no_mangle 指令,因此它们被正确命名。

感谢 Lang Hames,他在其他地方回答了我的问题。如果有人会和我看同样的问题,我在这里引用答案:

回答您的问题:SectionMemoryManager::getSymbolAddress 最终(通过 RTDyldMemoryManager 基础 class)调用 llvm::sys::DynamicLibrary::SearchForAddressOfSymbol,它会搜索所有先前加载的动态库符号。您可以调用 llvm::sys::DynamicLibrary::LoadLibraryPermanently(nullptr) 作为 JIT 初始化的一部分(在调用 getSymbolAddress 之前)以将程序的符号导入 DynamicLibrary 的符号表。

如果您真的想将程序中的所有函数都暴露给 JIT 代码,这是一个不错的选择。如果您只想公开一组有限的运行时函数,您可以将它们放在一个共享库中并加载它。