Как отобразить значение с относительным адресом RIP в GDB?

Я хотел бы отобразить целое число, лежащее в

global.variable+8(%rip)

Как я могу это сделать? А что именно означает этот адрес? Это адрес global.variable + %rip + 8, не так ли?


person meldo    schedule 04.05.2015    source источник


Ответы (1)


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
person scottt    schedule 05.05.2015