链接器命令在clang静态分析中的使用
我正在用链接器命令在clang静态分析中的使用,c,clang,static-analysis,call-graph,C,Clang,Static Analysis,Call Graph,我正在用python-clang-3.6库开发一个静态分析工具,它可以让我绘制函数调用图 要正确创建TranslationUnit,我需要使用相应的编译命令(即clang.cindex.Index.parse(c\u文件,compile\u命令))。然而,我相信,为了能够正确地互连TranslationUnits,我还需要使用链接器命令来知道哪个TranslationUnit使用其他TranslationUnits的函数。这是我的项目中的一个问题,在我的项目中,实际上使用一个“make”调用构建
python-clang-3.6
库开发一个静态分析工具,它可以让我绘制函数调用图
要正确创建TranslationUnit
,我需要使用相应的编译命令(即clang.cindex.Index.parse(c\u文件,compile\u命令)
)。然而,我相信,为了能够正确地互连TranslationUnits
,我还需要使用链接器命令来知道哪个TranslationUnit
使用其他TranslationUnits
的函数。这是我的项目中的一个问题,在我的项目中,实际上使用一个“make”调用构建了多个二进制文件,并且一些TranslationUnits
可能有冲突的符号名,因此我不能假设它们都是相互连接的
解决此问题的最佳方法是什么,以便我的工具知道C文件中的哪些函数可以调用其他C文件中的函数
目前我看到两种选择:
clang
中不受直接支持(至少在clang python库中是如此);或TranslationUnit
的AST树时,请记住函数声明在头文件中的位置。如果由于宏处理,我会得到不同的行号,或者为不同的TranslationUnits
使用隐式函数声明,那么这个选项看起来很棘手还有其他选择吗?哪个选项以及为什么选择您?我不确定是否有必要使用clang从源代码中提取信息,或者您是否可以简单地从生成的二进制文件中提取信息 如果您想查看二进制文件中使用的符号,可以使用
readelf -s <file>
readelf-s
这将列出符号表,您可以提取符号是由二进制文件提供的还是必需的(导入的)
使用
readelf -d <file> | grep NEEDED
readelf-d |需要grep
您将获得一个依赖库的列表