如何在gdb中显示具有RIP相对地址的值?

时间:2015-05-04 19:12:55

标签: assembly gdb x86-64

我希望显示一个位于

的整数
global.variable+8(%rip)

我该怎么办?这个地址究竟意味着什么?这是global.variable + %rip + 8的地址,不是吗?

1 个答案:

答案 0 :(得分:2)

global.variable+8(%rip)global.variable + 8的地址。它只是在指令编码中以RIP相对方式编码。

在下面的示例中,您可以看到global_variable+8(%rip)引用与*(((long long *)(&global_variable)) + 1)相同的地址:

t.S

#include <sys/syscall.h>

    .section .rodata
global_variable:
    .long 0x12345678
    .long 0x9abcdef0
    .long 0xdeadbeef
    .long 0x55aa55aa

    .section .text
    .global _start
_start:
    mov global_variable+8(%rip), %rax
    int $0x3 /* software breakpoint
                breaks into debugger */

    mov $SYS_exit_group, %rax
    mov $0, %rdi
    syscall

t.gdb

file t
run

printf "rax: 0x%lx\n", $rax
set variable $gv1 = *(((long long *)(&global_variable)) + 1)
printf "global_variable[1]: 0x%lx\n", $gv1

quit

示例会话

$ gdb -x t.gdb

Program received signal SIGTRAP, Trace/breakpoint trap.
_start () at t.S:17
17      mov $SYS_exit_group, %rax
rax: 0x55aa55aadeadbeef
global_variable[1]: 0x55aa55aadeadbeef