星号前的地址和推送指令,它被推送到哪里?

问题描述 投票:0回答:1

我正在完成一项任务,我需要使用GDB来理解已编译的C程序。我正在尝试按照说明操作但很难理解jmp命令正在跳转到*之前的地址时正在做什么。我看过地址所在的位置,但它介于两个单词之间。跳转后,有一个十六进制值的push命令。我只假设这基本上就像使用指针一样,而push命令会覆盖字节值,并将十六进制值压入其中。我不确定我有多远。这是我正在看的代码的一部分。由于它是编译的,我一直在使用x/10i $pc命令(根据我的位置更改要显示的指令数量)来查看下一行指令。

=> 0x08048334 <+0>:     jmp    *0x8049798
   0x0804833a <+6>:     push   $0x10
   0x0804833f <+11>:    jmp    0x8048304

第二个jmp开始一系列类似的事件。这是jmp指向的地址位置。这是我在编译的C文件的字节转储中看到此地址的唯一时间:

 8049795:   83 04 08 3a             addl   $0x3a,(%eax,%ecx,1)
 8049799:   83 04 08 4a             addl   $0x4a,(%eax,%ecx,1)

我很欣赏一些有用的见解,如果该值实际上被放入内存位置8049798,如果是这样,它将它改变为什么?

c assembly x86 gdb att
1个回答
2
投票

我正在尝试按照说明操作,但很难准确理解jmp命令正在做什么

看来你正在看PLT跳跃存根。你可以找到详细的描述here(寻找“懒惰绑定优化”),但这是一个非常高级的主题,你可能不应该试图理解该代码(至少还没有)。

这条指令:

jmp    *0x8049798

意思是:在0x8049798位置读取值并跳转到那里。

© www.soinside.com 2019 - 2024. All rights reserved.