为什么我会通过这种无条件跳转获得SIGSEGV?

时间:2016-10-16 19:57:30

标签: c assembly x86 inline-assembly sigsegv

我试图在Linux上运行此代码,看看会发生什么:

int fn(void) { return 0; }
int main(void) { __asm__("jmp fn;"); }

我没有看到SIGSEGV终止执行的任何理由,但这就是我得到的。我希望将流重定向到_start,因为在mainfn内没有以任何方式修改堆栈,并且激活记录中的返回地址仍应为&# 34;可用"

你能解释一下这背后的原因吗?

1 个答案:

答案 0 :(得分:4)

return 0生成类似

的内容
mov $0x0, %eax
ret

其中ret 从堆栈中弹出返回地址并跳转到那里。一个简单的jmp不会推送任何返回地址,因此ret将弹出堆栈中的任何内容。