【发布时间】:2021-01-15 14:34:53
【问题描述】:
在我的项目中,我发出 LLVM IR,它调用动态库中的外部函数。
我声明我的外部函数,例如:
declare %"my_type"* @"my_function"()
在外部库中,函数声明如下:
extern "C" {
my_type* my_function();
}
当我编译并运行 IR 时,进程立即崩溃。如果我声明并调用我知道不存在的无意义函数,则会发生相同的行为,因此我假设正在发生的事情是没有找到/链接外部函数。 (我不认为函数本身会崩溃)。
我正在使用 Python 的 llvmlite 库来执行此任务,并且在我 JIT 并调用我的 LLVM IR 的同一进程中,我导入了另一个需要外部动态库的 python 库;所以我假设该库已加载并在内存中。
我用来编译和执行 LLVM 代码的过程与this document 中的过程基本相同,只是 IR 声明并调用了一个外部函数。我试过调用cos(),就像the Kaleidoscope tutorial一样,这成功了,所以我不确定我自己的库函数有什么不同。
我尝试在函数名称的开头添加下划线,但得到了相同的结果。 (是否需要在 LLVM 函数声明中添加下划线?)
- 如何验证我的假设,即由于找不到命名函数而导致进程崩溃?
- 如何诊断未找到该函数的原因?
- 为了在 LLVM 代码中使用动态库中的外部函数,我需要做什么?
编辑:似乎确实很难将函数指针指向我的外部函数。如果我尝试通过用%"foo" = ptrtoint %"my_type"* ()* @"my_function" to i64 替换我的调用来仅打印函数地址并返回/打印结果,它仍然会出现段错误。仅仅试图获取指针就足以导致崩溃!为什么会这样,我该如何解决?
编辑:另外忘了提——这是在 Ubuntu 上(在 Docker 容器中,在 OSX 上)。
【问题讨论】:
标签: llvm dynamic-linking extern ffi llvmlite