反汇编程序输出中的函数偏移

Offset in function in disassembler output

无法找到 (或提出问题 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 进行后处理)

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

这里是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 是从函数开始算起的 10 个字节。第一个 mov 3 个字节,第二个 mov 5 个字节,syscall.

2 个字节

如果您想将它与您的代码相关联,这在很大程度上取决于它是否经过优化。

如果偏移量很大,您可能没有足够的符号。例如。仅使用导出符号,您可能会看到类似 +0x2AF4 的偏移量,并且您无法再说明任何有关实际功能的信息。