这个问题与我今天早些时候提出的一个问题有关:我想知道是否可以从给定函数(或符号名称,例如取自nm
)生成调用者图,即使感兴趣的函数不是“我的" 源代码(例如位于库中,例如malloc()
)
例如,要知道在malloc
名为我的程序中使用的位置,我foo
首先会查找符号名称:
nm foo | grep malloc
U malloc@@GLIBC_2.2.5
然后运行一个工具(它可能需要我的程序的特殊编译/链接版本或一些编译器工件):
find_usages foo-with-debug-symbols "malloc@@GLIBC_2.2.5"
这将生成一个(文本)调用者图,然后我可以进一步处理。
阅读这个问题我发现radare2似乎完成了几乎所有你能想象到的事情,但不知何故我还没有设法从给定的符号生成调用者图..
进步
使用radare2
我已经设法dot
从可执行文件生成调用者图,但仍然缺少一些东西。我正在编译以下 C++ 程序,我很确定它必须使用malloc()
or new
:
#include <string>
int main() {
auto s = std::string("hello");
s += " welt";
return 0;
}
我用静态库编译它,以确保我想分析的所有调用都可以在二进制文件中找到:
g++ foo.cpp -static
通过运行nm a.out | grep -E "_Znwm|_Znam|_Znwj|_Znaj|_ZdlPv|_ZdaPv|malloc|free"
你可以看到很多用于内存分配的符号。
现在我radare2
在可执行文件上运行:
r2 -qAc 'agCd' a.out > callgraph.dot
使用一个小脚本(受此答案的启发),我正在从包含“sym.operatornew”的任何符号中寻找一个调用路径,但似乎没有!
有没有办法确保从/到在该二进制文件中调用的任何函数生成调用图所需的所有信息?
有没有更好的方法来运行radare2?看起来不同的调用图可视化类型提供了不同的信息 - 例如,ascii 艺术生成器确实提供了点生成器未提供的符号名称,而点生成器提供了有关调用的更多详细信息。