2011-04-15 27 views
1

0x0000000149ab0d2c < 0000> jmpq * 0x1e04b6(%RIP)#0x149c911e8为什么jmpq可以跳到与Mac OS X上的GDB提示不同的地址?

(GDB)P $ RIP $ 1 =(无效(*)(无效))0x149ab0d2c

(GDB)P $ RIP + 6 + 0x1e04b6 $ 4 =(无效(*)(无效))0x149c911e8

步骤1之后:(它应该是在0x149c911e8然后,然而...)

(GDB)p $ RIP $ 5 =( void(*)(void))0x148c46d4a

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

回答

3

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

+0

您的意思是_indirect_? – ninjalj 2011-04-15 22:14:51