为什么下面的程序在执行时不会崩溃,而是在 GDB 中出现段错误而崩溃?使用 GCC 4.5.2 在 32 位 x86(Athlon 64,如果需要的话)上编译。
#include <stdio.h>
#include <string.h>
int modify(void)
{
__asm__("mov $0x41414141, %edx"); // Stray value.
__asm__("mov $0xbffff2d4, %eax"); // Addr. of ret pointer for function().
__asm__("mov %edx, (%eax)");
}
int function(void)
{
modify();
return 0;
}
int main(int argc, char **argv)
{
function();
return 0;
}
mov $0xbffff2d4, %eax 是使用 GDB 确定的,以查找存储“函数”函数的返回指针的地址。这在不同的系统上可能会有所不同。为此禁用了 ASLR。
当我执行程序时,什么也没有发生。也没有关于 dmesg 崩溃的报告。但是,当我在 GDB 中执行相同的程序时:
Program received signal SIGSEGV, Segmentation fault.
0x41414141 in ?? ()
=> 0x41414141: Cannot access memory at address 0x41414141
这也是我正常执行程序时所期望的。当其他程序崩溃时,我确实会像往常一样遇到段错误,而且我可以轻松编写一个小程序,该程序会因段错误而崩溃。但是为什么这个特定的程序不会因段错误而崩溃?