反汇编输出中的偏移功能

时间:2016-03-17 14:52:38

标签: debugging disassembly objdump

在简单的(或noob)问题上找不到(或向Google提出要查找的问题)答案。
我正在使用objdump -d工具检查应用程序:

. . . 5212c0: 73 2e jae 5212f0 <rfb::SMsgReaderV3::readSetDesktopSize()+0x130> 5213e8: 73 2e jae 521418 <rfb::SMsgReaderV3::readSetDesktopSize()+0x258> 521462: 73 2c jae 521490 <rfb::SMsgReaderV3::readSetDesktopSize()+0x2d0> . . .

输出中的+XXXX偏移是什么意思?如果可能,我如何将其与源代码相关联? (后处理c++filt

1 个答案:

答案 0 :(得分:1)

它是从函数开头的字节偏移量。

以下是WinDbg的一个示例,但它无处不在:

这是当前的调用堆栈:

0:000> k L1
 # Child-SP          RetAddr           Call Site
00 00000000`001afcb8 00000000`77b39ece USER32!NtUserGetMessage+0xa

这就是函数的样子:

0:000> uf USER32!NtUserGetMessage
USER32!NtUserGetMessage:
00000000`77b39e90 4c8bd1          mov     r10,rcx
00000000`77b39e93 b806100000      mov     eax,1006h
00000000`77b39e98 0f05            syscall
00000000`77b39e9a c3              ret

这就是当前的指令:

0:000> u USER32!NtUserGetMessage+a L1
USER32!NtUserGetMessage+0xa:
00000000`77b39e9a c3              ret

因此,偏移0x0A是函数start的10个字节。第一个mov为3个字节,第二个mov为5个字节,syscall为2个字节。

如果要将其与代码相关联,则很大程度上取决于它是否已经过优化。

如果偏移量非常高,则可能没有足够的符号。例如。只使用导出符号,您可能会看到+0x2AF4之类的偏移量,而且您无法再了解真实函数。