如何在 gdb 中显示具有 RIP 相对地址的值?
How to display value having RIP relative address in gdb?
我想显示一个整数,它位于
global.variable+8(%rip)
我该怎么做?这个地址到底是什么意思?它是 global.variable
+ %rip
+ 8
的地址,不是吗?
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 [=10=]x3 /* software breakpoint
breaks into debugger */
mov $SYS_exit_group, %rax
mov [=10=], %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
我想显示一个整数,它位于
global.variable+8(%rip)
我该怎么做?这个地址到底是什么意思?它是 global.variable
+ %rip
+ 8
的地址,不是吗?
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 [=10=]x3 /* software breakpoint
breaks into debugger */
mov $SYS_exit_group, %rax
mov [=10=], %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