你好,有人能给我一个暗示这里发生了什么吗?
#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进行编译,但它似乎没有任何效果。
感谢。
答案 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