我的代码中有这个代码段
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(数据执行预防)。可能是这个功能正在创建这个编译错误?如果是的话,如何禁用它?
答案 0 :(得分:6)
指令jmp *%esp
仅在16位和32位模式下可用。在64位模式下,jmp r/m32
无法编码。根据您的意图,有两种方法可以修复您的代码:
-m32
以使编译器发出32位代码。jmp *%rsp
以跳转到rsp
寄存器中包含的地址。请注意,这与DEP无关。 DEP阻止执行未明确标记为可执行的内存区域。这发生在运行时,而不是在编译时。