gcc / Linux:挂钩exit()调用以防止退出

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gcc / Linux:挂钩exit()调用以防止退出相关的知识,希望对你有一定的参考价值。

我有一个非常独特的案例,我从一个更高级别的C程序调用第三方库(我无法修改)。

此代码有一个清理例程,调用exit() - 它终止整个应用程序。

但是,我不想在此时终止整个应用程序,因为主应用程序仍然需要完成一些工作。

因此,为了解决这个问题,我尝试通过使用dlsym临时“别名”对一个虚函数的exit()函数来“欺骗”这个第三方库 - 然后将exit()恢复到正常状态。这个解决方案几乎可以工作 - 使用LD_PRELOAD指向虚拟出口包装器我可以看到这个虚拟出口函数被调用 - 但是,在此之后,当这个函数超出范围时,我得到了一个分段错误。

我怀疑这与gcc默认情况下在此函数上放置一个名为noreturn的属性这一事实有关。

有没有办法删除这个noreturn属性,或者更好的另一种方法是阻止这个第三方库调用exit()?

任何和所有建议都将非常感激。

答案

忽略这一事实,这可能是一个坏主意,这是一个老问题,它的接缝将在评论中回答。如果在Linux上使用gcc(可能是其他系统,我不知道),还有另一种解决方案。

/* compile with "gcc -Wl,-wrap,exit -o test wrap_exit.c" */
/* check exit status with "echo $?" */

#include <stdio.h>
#include <stdlib.h>

void __real_exit(int status);

void __wrap_exit(int status)
{
  int stat = 2;
  printf("trying to exit with status %d
", status);
  printf("now exiting for real with status %d
", stat);
  __real_exit(stat);
}

int main(void)
{
  exit(1);

  return 0;
}

以上是关于gcc / Linux:挂钩exit()调用以防止退出的主要内容,如果未能解决你的问题,请参考以下文章

如何错开异步 API 调用以防止使用 grequests 库进行最大重试?

Python--linux下安装依赖时报错command 'gcc' failed with exit status 1

Python--linux下安装依赖时报错command 'gcc' failed with exit status 1

实现linux系统调用以重启

command 'x86_64-linux-gnu-gcc' failed with exit status 1错误及解决方案

Linux - atexit()(注册终止)函数