我正在创建一个简单的基于MCJIT的JIT(更精确地实现Kaleidoscope tutorial in Rust)。我使用SectionMemoryManager :: getSymbolAddress进行符号解析。它看到来自库的符号(例如sin函数),但无法从我的程序中解析函数(全局,用nm显示,用T标记)。这是预期的行为吗?或者我的代码中是否有错误?
如果这是预期的行为,我该如何正确解析当前进程中的符号?我现在正在使用LLVMAddSymbol从流程中添加符号,因此解析开始起作用。这是正确的解决方案吗?
对于那些阅读我的代码的人。符号的问题与名称修改无关,因为当我尝试使SectionMemoryManager :: getSymbolAddress工作时,我使用no_mangle指令,因此它们被正确命名。
答案 0 :(得分:1)
感谢Lang Hames,他在其他地方回答了我的问题。如果有人会像我一样看待同样的问题,我会在这里引用答案:
回答你的问题:SectionMemoryManager::getSymbolAddress
最终(通过RTDyldMemoryManager
基类)调用llvm::sys::DynamicLibrary::SearchForAddressOfSymbol
,它会搜索所有先前加载的动态库中的符号。您可以拨打llvm::sys::DynamicLibrary::LoadLibraryPermanently(nullptr)
作为JIT初始化的一部分(在致getSymbolAddress
之前)将程序的符号导入DynamicLibrary
的符号表。< / p>
如果您真的想将程序中的所有函数公开给JIT代码,这是一个很好的方法。如果您只想公开一组有限的运行时函数,可以将它们放在共享库中,然后加载它。