使用objdump反汇编一个函数

我已经在我的系统上安装了一个二进制文件,并希望查看给定函数的反汇编。 最好使用objdump ,但其他解决scheme也是可以接受的。

从这个问题我知道,如果我只知道边界地址,我可能能够反汇编代码的一部分。 从这个答案我已经学会了如何将我的拆分debugging符号恢复成单个文件。

但即使在单个文件上运行,甚至可以反汇编所有的代码(即没有启动或停止地址,但objdump普通的-d参数),我仍然没有看到任何地方的符号。 这是有道理的,因为所讨论的function是静态的,所以不会被导出。 不过, valgrind会报告函数名,所以它必须存储在某个地方。

看看debugging部分的细节,我发现在.debug_str部分提到的名称,但我不知道一个工具,可以把它变成一个地址范围。

我会build议使用gdb作为最简单的方法。 你甚至可以把它作为一个单行的,如:

 gdb -batch -ex 'file /bin/ls' -ex 'disassemble main' 

awk解决方法

打印段落提到在: https : //unix.stackexchange.com/questions/82944/how-to-grep-for-text-in-a-file-and-display-the-paragraph-that-has-the -文本

 objdump -d a.out | awk -v RS= '/^[[:xdigit:]].*<FUNCTION>/' 

当使用-S ,我不认为有一个不可靠的方法,因为代码注释可能包含任何可能的序列…但是几乎所有的时间都是这样的:

 objdump -S a.out | awk '/^[[:xdigit:]]+ <FUNCTION>:$/{flag=1;next}/^[[:xdigit:]]+ <.*>:$/{flag=0}flag' 

改编自: 如何selectawk / sed中可能出现多次的两个标记模式之间的行

邮件列表回复

邮件列表上有一个2010年的post,说这是不可能的: https : //sourceware.org/ml/binutils/2010-04/msg00445.html

除了Tom提出的gdb解决方法外,他们还对使用-ffunction-section编译的另一个(更糟糕的)解决方法进行了评论,每个部分放一个函数,然后转储该部分。

Nicolas Clifton给了它一个WONTFIX https://sourceware.org/ml/binutils/2015-07/msg00004.html ,可能是因为GDB的解决方法涵盖了这个用例。

这就像gdb解决scheme一样工作(因为它将偏移量移向零),除非它不是laggy(在我的PC上在5ms左右完成工作,而gdb解决scheme大约需要150ms):

objdump_func:

 #!/bin/sh # $1 -- function name; rest -- object files fn=$1; shift 1 exec objdump -d "$@" | awk " /^[[:xdigit:]].*<$fn>/,/^\$/ { print \$0 }" | awk -F: -F' ' 'NR==1 { offset=strtonum("0x"$1); print $0; } NR!=1 { split($0,a,":"); rhs=a[2]; n=strtonum("0x"$1); $1=sprintf("%x", n-offset); printf "%4s:%s\n", $1,rhs }' 

为了简化awkparsingobjdump输出相对于其他答案的用法:

 objdump -d filename | sed '/<functionName>:/,/^$/!d'