几个月后,第一次使用GDB在新的Linux VM上反汇编程序。上一次,当我反汇编程序,设置断点并运行时,“ ir rip”返回的值将与程序指令之一的地址完全匹配。
这一次,由“ ir rip”返回的值== 0x5 ... 54699 <main + 15”,而为<+15>显示的程序集地址==“ 0x0 ... 0699”。
GDB现在是否在使用相对寻址并将较高的(无关的?)地址位清零,类似于Wireshark对序列号所做的操作?
这是我的屏幕转储:反汇编代码和rip查询
您正在查看与位置无关的可执行文件(PIE)。
该可执行文件链接到加载地址address 0
,并0x54...
在执行时重定位到address。
如果您disas main
在第一次运行二进制文件之前,GDB将显示原始的链接地址。如果在第一次运行后执行相同的命令,则GDB将显示重定位的(实际)地址。
您也可以使用链接非PIE二进制文件gcc t.c -no-pie
。该二进制文件将表现出您期望的行为:disas main
第一次运行之前和之后的输出不会改变,并且反汇编将与rip
运行时的实际值匹配。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句