2

这个问题与我今天早些时候提出的一个问题有关:我想知道是否可以从给定函数(或符号名称,例如取自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 艺术生成器确实提供了点生成器未提供的符号名称,而点生成器提供了有关调用的更多详细信息。

4

1 回答 1

2
于 2018-10-17T15:35:57.073 回答