我的代码中有这个代码段
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
进行编码。根据您的意图,有两种方法可以修复您的代码:
-m32
链接,以使编译器发出32位代码。 jmp *%rsp
,以跳转到rsp
寄存器中包含的地址。 请注意,这独立于DEP。 DEP阻止执行未明确标记为可执行的内存区域。这是在运行时发生的,而不是在编译时发生的。
关于c - 使用 "jmp *%esp"时操作数类型不匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50784251/