我有一个使用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);
我正在做,并且没有错误返回。
答案 0 :(得分:2)
事实证明,我试图在宿主进程中找到的符号被nm标记为本地(t)。
nm HostProcess | grep _function_name
00000001000f8590 t _function_name
解决方案是添加
__attribute__((visibility("default")))
到函数声明。 nm现在返回全局(T),getSymbolAddressInProcess返回函数ptr。