我的代码中有这个代码段

void jmp_esp()
{
    __asm__("jmp *%esp");
}

用gcc编译时
gcc aslr.c -o aslr -ggdb -fno-stack-protector -z execstack

我得到这个错误。
aslr.c: Assembler messages:
aslr.c:6: Error: operand type mismatch for `jmp'

为什么在汇编指令有效的情况下此行仍无法编译?

我已经阅读了有关DEP(数据执行保护)的信息。可能是此功能造成了此编译错误吗?如果是这样,如何禁用它?

最佳答案

指令jmp *%esp仅在16位和32位模式下可用。在64位模式下,无法对jmp r/m32进行编码。根据您的意图,有两种方法可以修复您的代码:

  • (如果您打算编写32位x86程序),请编译并与-m32链接,以使编译器发出32位代码。
  • (如果您打算编写64位x86程序),请将指令更改为jmp *%rsp,以跳转到rsp寄存器中包含的地址。

  • 请注意,这独立于DEP。 DEP阻止执行未明确标记为可执行的内存区域。这是在运行时发生的,而不是在编译时发生的。

    关于c - 使用 "jmp *%esp"时操作数类型不匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50784251/

    10-11 18:58