1

0x0000000149ab0d2c <+0000> jmpq *0x1e04b6(%rip) # 0x149c911e8

(gdb) p $rip $1 = (void (*)(void)) 0x149ab0d2c

(gdb) p $rip+6+0x1e04b6 $4 = (void (*)(void)) 0x149c911e8

stepi 之后:(它应该在 0x149c911e8,但是......)

(gdb) p $rip $5 = (void (*)(void)) 0x148c46d4a

顺便说一句,我的环境是 Mac OS X 10.6.4。该程序加载了 2 个 dylib,它们都链接到使用 -fPIC 选项编译的同一个静态库。这个问题混淆了 dylib 并使它们中的一个调用另一个函数,这是不应该的,因为它们实际上是相互独立的。

4

1 回答 1

3

说明这*是绝对跳跃,不是相对跳跃。绝对跳转将跳转到存储在寄存器中的地址,或者,在这种情况下,跳转到存储在给定位置的地址。如果你阅读地址 0x149c911e8 ( x/gx 0x149c911e8) 的内容,你可能会发现它包含地址 0x148c46d4a。

于 2011-04-15T18:49:09.990 回答