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

问题描述 投票:0回答:1

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

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

我没有看到SIGSEGV终止执行的任何理由,但这就是我得到的。我预计流量会被重定向到_start,因为堆栈在mainfn中没有任何修改,激活记录中的返回地址仍应“可用”。

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

c assembly x86 inline-assembly sigsegv
1个回答
4
投票

return 0产生类似的东西

mov $0x0, %eax
ret

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

© www.soinside.com 2019 - 2024. All rights reserved.