为什么gdb中反汇编指令的首位数字与rip中的值不匹配?任何人都可以提供背景吗?

Why do the first digits of disassembled instructions in gdb not match the value in rip? Can anyone provide background?

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

这一次,"i r rip" == 0x5...54699 显示的程序集地址 == "0x0...0699"。

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

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

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

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

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

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