我正在编写一个工具,需要为一些C项目生成调用图(callgraph)。
我已经可以使用clang为一个文件生成调用图,但是我不知道如何在整个包含数十个头文件和源文件的项目中生成调用图。
任何能够生成可解析文件的调用图工具都可以,如果有可用的库会更好。
我正在编写一个工具,需要为一些C项目生成调用图(callgraph)。
我已经可以使用clang为一个文件生成调用图,但是我不知道如何在整个包含数十个头文件和源文件的项目中生成调用图。
任何能够生成可解析文件的调用图工具都可以,如果有可用的库会更好。
将我的评论转化为答案。
您可以查看汇编输出并使用脚本处理。假设在Linux上使用gcc,您需要向gcc
传递-S
标志,并使用以下类似的内容处理结果:
perl -ne '/^([^. \t#].*):/ and $f=$1;/call\s+([^*]\S*)/ and print "$f -> $1\n";' *.S
dot
或其他您想要处理它的工具。您可以省略正则表达式中“不得以星号开头”的部分,以获得一些间接调用的指示。您仍然无法确定在该点将调用哪些函数,但至少您会知道还有更多需要了解的内容。
ld --gc-sections
也必须进行某种调用图分析。不确定是否可以钩入其中,但可能有办法。它可能无法真正处理间接调用,但它可能能够决定何时某些代码获取函数地址以便稍后调用。 - MvGsystem()
...不需要用户参与,也不需要打开GUI。 - Tony Delroy