使用 clang 和插件编译

Posted

技术标签:

【中文标题】使用 clang 和插件编译【英文标题】:compiling with clang and plugin 【发布时间】:2017-04-27 20:11:40 【问题描述】:

clang 支持插件,这个概念通常用于构建静态分析等工具。 为了开始使用它,我使用了this example,它打印了目标 cpp 文件中存在的所有函数名称。 我编译了运行以下插件的插件:

clang++ -v -std=c++11 PrintFunctionNames.cpp \
 $(llvm-config --cxxflags --ldflags) \
 -o plugin.so -shared -Wl,-undefined,dynamic_lookup

然后“按本书”运行它:

clang++ \
 -c main.cpp \
 -Xclang -load \
 -Xclang $PWD/plugin.so \
 -Xclang -plugin \
 -Xclang print-fns

它工作得很好:它打印 main.cpp 中的函数名然后退出(由于 -c 标志而不编译 main.cpp)。

我想做的是打印所有函数名并将 main.cpp 编译成可执行文件。 我尝试删除 -c 标志,但得到了:

/usr/bin/ld: cannot find /tmp/main-284664.o: No such file or directory

我做错了什么?

【问题讨论】:

【参考方案1】:

你需要使用 -add-plugin 而不是 -plugin

【讨论】:

【参考方案2】:

我一直认为运行两次clang 是“自然的”,但这是一个有效的问题。

我不认为你做错了什么,但我相信(没有过多挖掘clang 来源)正在发生的事情是所有Xclang 都被转发到cc1 part 的clang 创建临时文件以适应插件运行。但是,当链接器作为单独的进程被调用时,这些文件不再存在,因此出现错误。 您可以通过在所有这些命令上使用 -v 选项来查看所有内容。

我不确定这是否可能,但这个 SO thread 可能会提供正确方向的线索。

【讨论】:

“此 SO 线程”的链接已损坏。你还有机会吗? @mrks 链接已修复

以上是关于使用 clang 和插件编译的主要内容,如果未能解决你的问题,请参考以下文章

iOS学习使用 Xcode 开发 Clang 插件

clang 插件编译错误:未定义符号 llvm::Registry<clang::PluginASTAction, llvm::RegistryTraits<clang::PluginAS

使用Xcode开发iOS语法检查的Clang插件

iOS底层探索之LLVM——自定义Clang插件(下)

IOS逆向-LLVM代码混淆

在Windows使用clang编译器