Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
链接器命令在clang静态分析中的使用_C_Clang_Static Analysis_Call Graph - Fatal编程技术网

链接器命令在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
    
    您将获得一个依赖库的列表