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

问题描述 投票:2回答:1

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

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

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

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

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

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

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

c linux gcc hook exit
1个回答
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;
}
© www.soinside.com 2019 - 2024. All rights reserved.