我已经在我的系统上安装了一个二进制文件,并希望查看给定函数的反汇编。最好使用objdump
,但其他解决方案也是可以接受的。使用objdump反汇编一个函数
From this questions我知道如果我只知道边界地址,我可能会反汇编部分代码。从this answer我学会了如何将我的拆分调试符号恢复为单个文件。但即使在单个文件上运行,甚至拆卸所有代码(即没有开始或停止地址,但参数为objdump
),我仍然没有在任何地方看到该符号。这是有意义的,因为所讨论的函数是静态的,所以它不会被导出。尽管如此,valgrind
将报告函数名称,所以它必须存储在某个地方。
看看调试部分的细节,我发现在.debug_str
部分提到的名称,但我不知道一个工具,它可以把它变成一个地址范围。
A小调侧面说明:如果一个函数标记为'static',它可能会被编译器内联到其呼叫站点。这可能意味着实际上可能没有任何功能可以进行反汇编。如果您可以找到其他功能的符号,但找不到您正在查找的功能,这是一个强烈暗示该功能已被内联的提示。 Valgrind可能仍然引用原始的预先内置函数,因为ELF文件调试信息存储每个单独指令源自的位置,即使指令移动到别处。 – davidg
@davidg:是的,但是由于汤姆在这种情况下的回答,似乎并非如此。尽管如此,你是否知道一种方法,例如用每条指令来自哪里的信息来注释汇编代码? – MvG
好听! 'addr2line'将接受来自'stdin'的PC/IP并打印出相应的源代码行。同样,'objdump -l'会混合objdump和源代码行;尽管对于高度优化的内联代码,两个程序的结果并不总是特别有用。 – davidg