加载LLVM插件时出现未定义的符号

3
我正在开发一个LLVM插件,并希望通过Clang LLVM驱动程序将其作为插件运行:
clang -Xclang -load -Xclang myPlugin.so ...

起初我遇到了一个类似于这里描述的错误

按照建议使用-D_GLIBCXX_USE_CXX11_ABI=0标志后,我遇到了以下错误:

error: unable to load plugin 'myPlugin.so': 'myPlugin.so: undefined symbol: _ZNK4llvm12FunctionPass17createPrinterPassERNS_11raw_ostreamERKSs

这个页面暗示可能存在ABI兼容性问题(我并不完全理解)

我的目标是使用GCC或Clang编译该程序,并在系统Clang安装(Ubuntu 16.04,LLVM 3.8)上运行它,而不是从源代码构建Clang / LLVM。


我的MacOS和Ubuntu 16.04上的c++filt无法解码_ZNK4llvm12FunctionPass17createPrinterPassERNS_11raw_ostreamERKNSt7 - Viet
糟糕,我的错,我编辑了问题 :) - Nik391
它生成 llvm::FunctionPass::createPrinterPass(llvm::raw_ostream&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const - Nik391
2个回答

0
问题可能出现在安装了多个clang上。您用于编译插件的clang版本可能与调用的clang不同。
clang -Xclang -load -Xclang myPlugin.so ...

如果您使用cmake构建插件,则
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON

将生成文件compile_commands.json,其中包含您使用的llvm版本。如果您不使用cmake进行插件,则bear makemake -n是替代方法。

如果compile_commands.json包含例如

"command": "c++ -c -I/usr/lib/llvm-4.0/include ..."

如果clang -vclang version 3.8.0,你可能会遇到这个错误消息,特别是如果llvm::FunctionPass::createPrinterPass在llvm-4.0而不是llvm-3.8中。

解决方法可能是使用以下编译:

clang-xxx -Xclang -load -Xclang myPlugin.so ...

clang-xxx 包含了在 compile_commands.json 中引用的 llvm-xxx


0
我之前一直收到这个错误,因为我传递给RegisterPass的第一个参数与pass本身的名称相同:
static RegisterPass<MyPass> X("MyPass", "DPVariableNamePass", false, false);

更改它修复了问题:
static RegisterPass<MyPass> X("my-pass", "DPVariableNamePass", false, false);

也许它有帮助

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接