gpt4 book ai didi

c - 海湾合作委员会/Linux : hook exit() call to prevent exit from happening

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:06:58 26 4
gpt4 key购买 nike

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

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

但是,此时我不想终止整个应用程序,因为还有一些工作必须由主应用程序完成。

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

我怀疑这与默认情况下 gcc 将一个名为 noreturn 的 attribute 放在该函数上这一事实有关。

有没有办法删除这个 noreturn 属性,或者更好的另一种方法来防止这个第 3 方库调用 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\n", status);
printf("now exiting for real with status %d\n", stat);
__real_exit(stat);
}

int main(void)
{
exit(1);

return 0;
}

关于c - 海湾合作委员会/Linux : hook exit() call to prevent exit from happening,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32952184/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com