我有一个非常独特的案例,我从更高级别的C程序调用第三方库(我无法修改)。
此代码有一个清理例程,调用exit() - 终止整个应用程序。
但是,我现在不想终止整个应用程序,因为主应用程序仍然需要完成一些工作。
所以为了解决这个问题,我试图通过使用dlsym临时“别名”对一个虚函数的exit()函数来“欺骗”这个第三方库 - 然后将exit()恢复到正常状态。 这个解决方案几乎可以工作 - 使用LD_PRELOAD指向虚拟出口包装器我可以看到这个虚拟出口函数被调用 - 但是,在此之后,当这个函数超出范围时,我得到了一个分段错误。
我怀疑这与gcc默认情况下在此函数上放置一个名为noreturn的属性这一事实有关。
有没有办法删除这个noreturn attribite,或者更好的另一种方法是阻止这个第三方库调用exit()?
非常感谢任何和所有建议。
答案 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;
}