在简单的(或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
)
答案 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
之类的偏移量,而且您无法再了解真实函数。