地址和推送指令前的星号,它被推送到哪里?
Asterisk before an address and push instructions, where is it being pushed to?
我正在做一项作业,我需要理解使用 GDB 编译的 C 程序。我正在尝试按照说明进行操作,但在跳转到以 *
开头的地址时,我很难准确理解 jmp
命令在做什么。我查看了地址所在的位置,但它介于两个词之间。跳转后有一个十六进制值的push
命令。我只是假设这基本上就像使用指针,并且 push
命令用十六进制值覆盖字节值被推到它上面。我不确定我有多远。这是我正在查看的代码的一部分。自编译以来,我一直在使用 x/10i $pc
命令(根据我所在的位置更改要显示的指令数量)来查看下一行指令。
=> 0x08048334 <+0>: jmp *0x8049798
0x0804833a <+6>: push [=10=]x10
0x0804833f <+11>: jmp 0x8048304
第二个 jmp
继续开始一系列类似的事件。这是 jmp
指向的地址位置。这是我唯一一次在编译的 C 文件的字节转储中看到这个地址:
8049795: 83 04 08 3a addl [=11=]x3a,(%eax,%ecx,1)
8049799: 83 04 08 4a addl [=11=]x4a,(%eax,%ecx,1)
我希望能提供一些有用的见解,了解该值是否实际上已放入内存位置 8049798
,如果是,它会将其更改为什么?
I'm trying to follow the instructions but am having difficulty understanding exactly what the jmp command is doing
看来您正在查看 PLT 跳转存根。您可以找到详细说明 here(查找 "lazy binding optimization"),但这是一个 非常 的高级主题,您可能 不应该 试图理解该代码(至少现在还没有)。
这条指令:
jmp *0x8049798
表示:读取位置0x8049798
的值并跳转到那里。
我正在做一项作业,我需要理解使用 GDB 编译的 C 程序。我正在尝试按照说明进行操作,但在跳转到以 *
开头的地址时,我很难准确理解 jmp
命令在做什么。我查看了地址所在的位置,但它介于两个词之间。跳转后有一个十六进制值的push
命令。我只是假设这基本上就像使用指针,并且 push
命令用十六进制值覆盖字节值被推到它上面。我不确定我有多远。这是我正在查看的代码的一部分。自编译以来,我一直在使用 x/10i $pc
命令(根据我所在的位置更改要显示的指令数量)来查看下一行指令。
=> 0x08048334 <+0>: jmp *0x8049798
0x0804833a <+6>: push [=10=]x10
0x0804833f <+11>: jmp 0x8048304
第二个 jmp
继续开始一系列类似的事件。这是 jmp
指向的地址位置。这是我唯一一次在编译的 C 文件的字节转储中看到这个地址:
8049795: 83 04 08 3a addl [=11=]x3a,(%eax,%ecx,1)
8049799: 83 04 08 4a addl [=11=]x4a,(%eax,%ecx,1)
我希望能提供一些有用的见解,了解该值是否实际上已放入内存位置 8049798
,如果是,它会将其更改为什么?
I'm trying to follow the instructions but am having difficulty understanding exactly what the jmp command is doing
看来您正在查看 PLT 跳转存根。您可以找到详细说明 here(查找 "lazy binding optimization"),但这是一个 非常 的高级主题,您可能 不应该 试图理解该代码(至少现在还没有)。
这条指令:
jmp *0x8049798
表示:读取位置0x8049798
的值并跳转到那里。