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

时间:2017-05-02 19:33:20

标签: c++ llvm llvm-clang abi

我正在开发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。

2 个答案:

答案 0 :(得分:0)

问题可能来自多个clang安装。您用来编译插件的clang版本可能与

中调用的clang不同
clang -Xclang -load -Xclang myPlugin.so ...

如果您使用cmake来构建插件,那么

cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON

将生成文件compile_commands.json,其中将包含您使用的llvm版本。如果您不为插件使用bear make,则可以选择make -ncmake

如果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包含llvm-xxx中引用的compile_commands.json

答案 1 :(得分:0)

我收到该错误是因为传递给RegisterPass的第一个参数与传递本身的名称相同:

static RegisterPass<MyPass> X("MyPass", "DPVariableNamePass", false, false);

更改它可以解决此问题:

static RegisterPass<MyPass> X("my-pass", "DPVariableNamePass", false, false);

也许有帮助