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