RTDyldMemoryManager :: getSymbolAddressInProcess在主机进程中找不到符号

时间:2019-07-15 19:15:07

标签: llvm jit

我有一个使用llvm JIT运行代码的静态库(.a)。我希望它能够在主应用程序中调用函数。我创建了一个extern声明,并在我的IR中将其命名。我可以看到JIT正在尝试通过在内存管理器子类上调用getSymbolAddress来解析我的符号。对于这个符号,我应该能够使用:

 if (auto SymAddr = RTDyldMemoryManager::getSymbolAddressInProcess(name)){
            return SymAddr;
        }

但是我发现getSymbolAddressInProcess总是返回0。

我要查找的函数被声明为extern“ C”。

我已经确认这不是麻烦的问题(我尝试使用带前缀_和不带前缀_来解决)。我试过在主机中调用该函数,以确认编译器/链接器没有剥离该函数。我也可以从调试器中调用它,确认它存在。

相似的问题表明需要致电

llvm::sys::DynamicLibrary::LoadLibraryPermanently(nullptr, &error); 

我正在做,并且没有错误返回。

1 个答案:

答案 0 :(得分:2)

事实证明,我试图在宿主进程中找到的符号被nm标记为本地(t)。

nm HostProcess | grep _function_name
00000001000f8590 t _function_name

解决方案是添加

__attribute__((visibility("default")))

到函数声明。 nm现在返回全局(T),getSymbolAddressInProcess返回函数ptr。