用于clang静态分析的链接器命令的用法

Han*_*olo 5 c static-analysis clang call-graph

我正在开发一个带有python-clang-3.6库的静态分析工具,可以让我绘制函数调用图.

要正确创建,TranslationUnit我需要使用相应的编译命令(即clang.cindex.Index.parse(c_file, compile_command)).但是,我相信,为了能够正确互连,TranslationUnits我还需要使用链接器命令来知道哪些TranslationUnit使用其他功能TranslationUnits.这是我的项目中的一个问题,实际上有多个二进制文件是使用单个"make"调用构建的,有些TranslationUnits可能有冲突的符号名称,所以我不能假设它们都是相互连接的.

解决此问题的最佳方法是什么,以便我的工具知道C文件中的哪些函数可以调用其他C文件中的函数?

现在我看到两个选择:

  1. 以某种方式检索和使用链接器命令; 这个选项看起来很棘手,因为它没有直接支持clang(至少是clang python库); 要么
  2. 在遍历TranslationUnit的AST树时,记住Header文件中函数声明的位置.如果由于宏处理,我会得到不同的行号或者具有不同的隐式函数声明,这个选项看起来很棘手TranslationUnits.

还有其他选择吗?哪个选项以及为什么会选择你?

Han*_*mpf 1

我不确定是否有必要使用 clang 从源中提取信息,或者您是否可以简单地从生成的二进制文件中提取信息。

如果您想查看二进制文件中使用的符号,您可以使用

readelf -s <file>
Run Code Online (Sandbox Code Playgroud)

这列出了符号表,如果该符号是由二进制文件提供的或者是必需的(导入的),您可以提取该符号表。

使用

readelf -d <file> | grep NEEDED
Run Code Online (Sandbox Code Playgroud)

您将获得依赖库的列表。