c - 使用 gcc wrap 选项时出现段错误

标签 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 进行编译,但它似乎没有任何效果。

谢谢。

最佳答案

伙计们,我花了很长时间才发现发生了什么。

我的看法是,有时 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

关于c - 使用 gcc wrap 选项时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28268140/

相关文章:

C 堆栈/范围,函数结束后变量的生命周期

c - 过程识别

c - 使用 MingW 编译 SDL 项目时 undefined reference (不是 WinMain 错误)

使用 gnu 链接器更改入口点

linux - tf_version_script 给出语法错误

c - 有没有免费软件可以替代 CCS C 编译器?

c - 如何使用 'getchar()' 替换字符,否则?

c - 将字节数组从 go 传递到 cgo

c++ - 将 C++ 类及其派生类放在特定部分

c - 链接描述文件生成器