为什么 jmpq 在 Mac OS X 上可以跳转到与 GDB 提示不同的地址?
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 感到困惑,并使其中一个调用另一个 dylib 中的函数,这是不应该的,因为它们实际上是相互独立的。
0x0000000149ab0d2c <+0000> jmpq *0x1e04b6(%rip) # 0x149c911e8
(gdb) p $rip
$1 = (void (*)(void)) 0x149ab0d2c
(gdb) p $rip+6+0x1e04b6
$4 = (void (*)(void)) 0x149c911e8
after stepi: (It should be at 0x149c911e8 then, however...)
(gdb) p $rip
$5 = (void (*)(void)) 0x148c46d4a
btw, my environment is Mac OS X 10.6.4. The program loads 2 dylibs, both of which link to the same static library compiled with the -fPIC option. This issue confuses the dylibs and make one of them call functions in another one, which shouldn't, since they're actually independent with each other.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
*
表明这是绝对跳转,而不是相对跳转。绝对跳转将跳转到存储在寄存器中的地址,或者在这种情况下,跳转到存储在给定位置的地址。如果您读取地址 0x149c911e8 (x/gx 0x149c911e8
) 的内容,您可能会发现它包含地址 0x148c46d4a。The
*
shows that this is an absolute jump, not a relative jump. An absolute jump will either jump to the address stored in the register, or, in this case, jump to the address stored at the given location. If you read the contents of the address 0x149c911e8 (x/gx 0x149c911e8
), you will probably find that it contains the address 0x148c46d4a.