如何在以下英特尔指令中计算地址0x600860
? 0x4003b8
+ 0x2004a2
= 60085a
,所以我看不到计算是如何进行的。
0x4003b8 <puts@plt>: jmpq *0x2004a2(%rip) # 0x600860 <puts@got.plt>
答案 0 :(得分:21)
在Intel上,JMP,CALL等与 next 指令的程序计数器有关。
您案例中的下一条说明是0x4003be
和0x4003be + 0x2004a2 == 0x600860
答案 1 :(得分:0)
对于具有RIP相对寻址模式的内存间接JMP,它是AT&amp; T语法。
从相对于指令指针指定的内存位置获取跳转地址:
首先计算0x4003be + 0x2004a2 == 0x600860
然后获取地址以跳转到位置0x600860
。
其他寻址模式也是可能的,例如跳转表可能使用
jmpq *(%rdi, %rax, 8)
表格基础在RDI中,索引在RAX中。
但静态数据的RIP相对寻址很常见。在这种情况下,它通过动态链接设置GOT(全局偏移表)中的条目。