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

时间:2015-10-05 15:23:14

标签: c linux gcc hook exit

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

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

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

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

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

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

非常感谢任何和所有建议。

1 个答案:

答案 0 :(得分:0)

忽略以下事实:这可能不是一个好主意,这是一个古老的问题,需要在评论中加以回答。 如果在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\n", status);
  printf("now exiting for real with status %d\n", stat);
  __real_exit(stat);
}

int main(void)
{
  exit(1);

  return 0;
}