首页 > 解决方案 > gdb 中汇编注释中列出的地址的含义

问题描述

gdb会话中,如何计算程序集输出的注释中的地址列表?举个例子,我目前正在执行以下指令:

 0x0000555555556140  ? jmpq   *0x7af5a(%rip)        # 0x5555555d10a0 <strlen@got.plt>

我们可以确认指令指针与左栏中显示的地址匹配:

(gdb) p $rip
$1 = (void (*)()) 0x555555556140 <strlen@plt>

从这里,我们将跳转到 指向的地址$rip + 0x7af5a。带有跳转指针的地址

(gdb) p/z ($rip + 0x7af5a)
$2 = 0x00005555555d109a

指着

(gdb) x/g ($rip + 0x7af5a)
0x5555555d109a <getpwuid@got.plt+2>:    0xd1e0000055555555

这与该指令 ( ) 的注释中的地址不匹配0x5555555d10a0,我天真地以为它是为了传达跳转的去向。

该地址原来7af60来自当前指令:

(gdb) p/z 0x5555555d10a0 - 0x0000555555556140  # commented address - current address
$3 = 0x000000000007af60

即 ,$rip + 0x7af60超出跳转指针 ( $rip + 0x7af5a) 的 6 个字节。注释超出跳转指针 6 个字节的地址有什么意义?

不依赖GDB反汇编提供的注释,如何在GDB控制台中显示跳转地址? 或分配给 GDB 变量以在编写 GDB 脚本时使用。

标签: assemblygdbx86-64addressing-mode

解决方案


推荐阅读