使用LLVM链接到动态库中的外部函数

使用LLVM链接到动态库中的外部函数,llvm,dynamic-linking,extern,ffi,llvmlite,Llvm,Dynamic Linking,Extern,Ffi,Llvmlite,在我的项目中,我发出LLVM IR,它调用动态库中的外部函数 我声明我的外部函数如下: declare %"my_type"* @"my_function"() 在外部库中,函数声明如下: extern "C" { my_type* my_function(); } 当我编译IR并运行它时,进程立即崩溃。如果我声明并调用一个我知道不存在的无意义函数,同样的行为也会发生,所以我假设发生的是外部函数没有被找到/链接。(我不认为函

在我的项目中,我发出LLVM IR,它调用动态库中的外部函数

我声明我的外部函数如下:

declare %"my_type"* @"my_function"()
在外部库中,函数声明如下:

extern "C" {
    my_type* my_function();
}
当我编译IR并运行它时,进程立即崩溃。如果我声明并调用一个我知道不存在的无意义函数,同样的行为也会发生,所以我假设发生的是外部函数没有被找到/链接。(我不认为函数本身正在崩溃)

我正在使用Python的
llvmlite
库来完成这项任务,在JIT和调用LLVM-IR的同一个过程中,我导入了另一个Python库,它需要外部动态库;所以我假设库已加载并存储在内存中

我用来编译和执行LLVM代码的过程基本上与中的过程相同,只是IR声明并调用了一个外部函数。我尝试调用了中的
cos()
,但成功了,所以我不确定自己的库函数有什么不同

我尝试在函数名的开头添加下划线,但得到了相同的结果。(是否需要在LLVM函数声明中添加下划线?)

  • 我如何验证我的假设,即进程正在崩溃,因为找不到命名函数
  • 如何诊断未找到函数的原因
  • 为了从LLVM代码中使用动态库中的外部函数,我需要做什么

编辑:看来确实很难获得指向外部函数的函数指针。如果我试图通过将调用替换为
%“foo”=ptrtoint%“my_type”*()*@“my_function”来打印函数地址并返回/打印结果,它仍然会出错。仅仅试图获取指针就足以导致崩溃!为什么会这样,我该如何修复它

编辑:也忘了提到-这是在Ubuntu上(在OSX上的Docker容器中)



我找到了答案-我缺少需要调用
llvmlite.binding.load_library_永久(filename)
,以便外部符号可用。即使库已经在内存中,仍然需要调用该函数。(这对应于LLVM本机函数
LLVM::sys::DynamicLibrary::LoadLibraryPermanently()

从中,似乎使用
nullptr
调用上述函数将导入进程可用的所有符号

奇怪的是,在OSX上,我发现外部符号是可用的,即使
load_library_permany()
没有被显式调用-我不知道这是为什么(可能是
llvmlite
本身的OSX构建碰巧调用了带有
nullptr
的函数,如上所述?)