为什么 gdb 中反汇编指令的第一个数字与 rip 中的值不匹配?谁能提供背景?

问题描述

几个月后第一次使用 GDB 在新的 linux 虚拟机上反汇编程序。上一次,当我反汇编程序,设置断点并运行时,“i r rip”返回的值将与其中一条程序指令的地址完全匹配。

这次,“i r rip”返回的值== 0x5...54699

显示的汇编地址==“0x0...0699”。

GDB 现在是否使用相对寻址并将更重要(不相关?)的地址位归零,类似于 Wireshark 对序列号所做的处理?

这是我的屏幕转储: Disassembled code and rip query

解决方法

您正在查看 position-independent executable (PIE)。

此可执行文件链接到地址 0 加载,并在执行时重定位到 0x54... 地址。

如果您disas main 之前第一次运行二进制文件,GDB 将显示原始链接地址。如果您在第一次运行后 执行相同的命令,GDB 将显示重定位的(实际)地址。

您还可以使用 gcc t.c -no-pie 链接非 PIE 二进制文件。该二进制文件将表现出您期望的行为:disas main 的输出在第一次运行前后不会改变,反汇编将在运行时与 rip 的实际值匹配。