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

标签 assembly gdb x86-64

我想显示一个位于的整数

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 $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

示例 session

$ 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

关于assembly - 如何在gdb中显示具有RIP相对地址的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30038135/

相关文章:

assembly - 如何在中断服务程序中将寄存器保存在x86_64上?

assembly - NASM 调用函数后我应该弹出函数参数吗?

c++ - 启用中断时的 QEMU 三重故障

assembly - NASM 是纯汇编,而 MASM 是高级汇编?

linux - 关于Linux中程序的内存布局

c - 当进程启动时自动附加 gdb 并继续

c++ - 如何深入研究 shared_ptr [Netbeans、clang++、gdb]

.net - 在 Visual Studio 中使用 x64 库的 F# 类型提供程序

c++ - GDB 不显示堆栈的十六进制值

c - 使用 kmalloc 分配可执行内存