gpt4 book ai didi

linux - 如何使共享库在 Linux 下重新加载自身

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

我正在 Linux 下用 C++ 开发一个共享库。

例如,当有新构建可用时,共享库代码是否有重新加载自身的方法?

我正在考虑使用 dlclosedlopen 重新加载,但前者需要一个只能由正在运行的进程访问的句柄。

知道如何从共享库代码中检索该句柄吗?对整个想法有更好的解决方案吗?

我知道热插拔很危险,但这将使开发和测试更加容易。

最佳答案

当您重建共享库时,其导出的符号地址可能会改变。

因此,当重新加载共享库时,必须重新解析其用户导入的所有符号。

在卸载共享库之前必须销毁共享库中具有虚拟表的对象1

如果库是由 ld.so 自动加载的,则您无法重新加载它。

如果应用程序使用 dlopen 加载共享库,则必须再次运行相同的代码以重新加载库并重新解析符号。

还有可能使事情复杂化的线程本地存储。

换句话说,在应用程序不知情的情况下重新加载共享库太复杂了。


1我曾经调试过一个有趣的错误。有一个共享库,它在运行时使用 dlopen 加载并在使用后卸载。应用程序稍后会在终止期间在 std::cout 析构函数中崩溃。结果是共享库正在将 Boost.Date_Time 对象输出到 std::cout 中。这样做时,库将 std::cout.imbue 一个新的语言环境,其中包含来自 Boost.Date_Time 的自定义方面对象(方面具有虚函数)。当库被卸载时,facet 对象仍然属于该语言环境,但它的 vtable 指针指向卸载的共享库中的虚拟表,这会导致销毁 facet 时崩溃。

关于linux - 如何使共享库在 Linux 下重新加载自身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43121500/

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