如何使用objdump分解单个函数?

117

我在我的系统上安装了一个二进制文件,并想查看给定函数的反汇编代码。最好使用objdump,但其他解决方案也可以接受。

这个问题中,我了解到如果我只知道边界地址,就可以对代码的一部分进行反汇编。从这个答案中,我了解到如何将我的拆分调试符号转换回单个文件。

但是,即使在单个文件上操作,即使反汇编所有代码(即不带任何起始或停止地址,而是使用纯-d参数到objdump),我仍然没有看到该符号出现在哪里。这是有道理的,因为涉及到的函数是静态的,所以它没有被导出。尽管如此,valgrind将报告函数名称,因此它必须存储在某个地方。

查看调试部分的详细信息,我发现该名称在.debug_str部分中提到,但我不知道可以将其转换为地址范围的工具。


2
一个小的侧面说明:如果一个函数被标记为“static”,编译器可能会将它内联到其调用点中。这可能意味着实际上没有任何函数需要反汇编。如果您可以找到其他函数的符号,但找不到您要查找的函数,则这是一个强烈的提示该函数已被内联。Valgrind仍然可以引用原始的预内联函数,因为ELF文件调试信息存储了每个单独指令来自哪里,即使指令被移动到其他地方。 - davidg
@davidg:没错,但由于Tom的答案在这种情况下有效,这似乎不是问题。尽管如此,您是否知道一种方法,例如使用哪个信息来注释汇编代码每个指令来自哪里? - MvG
1
很高兴听到这个消息!addr2line将从stdin接受PCs/IPs并打印出它们对应的源代码行。同样,objdump -l将混合objdump和源代码行;但是对于高度优化且具有大量内联的代码,任何一个程序的结果都不总是特别有用。 - davidg
12个回答

0

只需使用 objdump -d 文件名 | awk '/<函数名>/,/^$/'


2
这个问题已经有八个现有的答案,其中包括一个被接受的答案,获得了94个赞。你确定你的答案还没有被提供吗?如果没有,为什么有人会更喜欢你的方法而不是现有的方法?你是否利用了新的功能?是否存在适合你的方法的场景? - Jeremy Caney
好的,感谢您的评论。我没有看到其他答案,只是留下了我的答案。同时,我并不打算要求点赞。 - kingkong
但是,你的解决方案相比其他方案有什么优势呢?你能否将这些细节编辑到你的答案中?这看起来很像“sed”解决方案。为什么要使用“awk”而不是“sed”? - General Grievance

0
在gcc-objdump中,可以使用objdump -C --disassemble="funcName" -j.text procName命令。

你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接