使用gcc wrap选项时进行segfaulting

时间:2015-02-01 21:28:45

标签: c ld

你好,有人能给我一个暗示这里发生了什么吗?

#include <stdlib.h>

void __wrap_exit(int code)
{
    return;
}

int main(int argc, char *argv[])
{
    exit(5);
    return 0;
}

汇编:gcc main.c -g -Wl,--wrap=exit

我尝试调试程序并打印出来:

Program  received signal    SIGSEGV, Segmentation fault.
0x00007fffffffde88 in ?? ()
(gdb) n
Cannot find bounds of current function

在我尝试使用open()进行类似的实验之前,它运行良好。 为了避免在exit()周围进行一些有趣的编译器优化,我尝试使用-O0进行编译,但它似乎没有任何效果。

感谢。

1 个答案:

答案 0 :(得分:1)

男人,我花了很长时间才发现发生了什么。

我的观点是,有时gcc在不需要时太聪明了。在这种情况下,它将exit作为builtin处理,而不是将其视为普通的C函数。

这是我的test.c

extern void exit(int code);

void __wrap_exit(int code)
{
    return;
}

int main(int argc, char *argv[])
{
    exit(5);
    return 0;
}

这些是结果:

$ gcc -fno-builtin -otest test.c -Wl,--wrap=exit
$ ./test; echo $?
0
$ gcc -fno-builtin -otest test.c
$ ./test; echo $?
5