我正在做一个作业,我需要理解使用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中,如果是的话,它会改变成什么呢?

最佳答案

我试图按照说明操作,但是很难理解jmp命令到底在做什么
看来你在看PLT跳转存根。您可以找到详细的描述here(查找“延迟绑定优化”),但这是一个非常高级的主题,您可能不应该试图理解该代码(至少还没有)。
本说明:

jmp    *0x8049798

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

10-05 20:49
查看更多