问题描述
几个月后第一次使用 GDB 在新的 linux 虚拟机上反汇编程序。上一次,当我反汇编程序,设置断点并运行时,“i r rip”返回的值将与其中一条程序指令的地址完全匹配。
这次,“i r rip”返回的值== 0x5...54699
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
的实际值匹配。