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
command 'x86_64-linux-gnu-gcc' failed with exit status 1错误及解决方案