Zer*_*ool 4 linux shared-libraries
我正在 Linux 下用 C++ 开发一个共享库。
例如,当新版本可用时,共享库代码是否有办法重新加载自身?
我正在考虑使用dlclose和dlopen重新加载,但前者需要一个只能由正在运行的进程访问的句柄。
知道如何从共享库代码中检索该句柄吗?对整个想法有更好的解决方案吗?
我知道热插拔很危险,但这将使开发和测试变得更加容易。
当您重建共享库时,其导出的符号地址可能会更改。
因此,当重新加载共享库时,用户导入的所有符号都必须重新解析。
在卸载共享库1之前,必须销毁驻留在共享库中的具有虚拟表的对象之前,必须销毁驻留在共享库中的具有虚拟表的对象。
如果库是由自动加载的ld.so您自动加载的,则无法重新加载它。
如果应用程序使用加载共享库dlopen,则必须再次运行相同的代码以重新加载库并重新解析符号。
还有线程本地存储可能会使事情变得复杂。
换句话说,在应用程序不知道的情况下重新加载共享库太复杂了。
1我过去曾经调试过一个有趣的错误。有一个共享库,它在运行时加载dlopen,使用后卸载。应用程序稍后会std::cout在终止期间在析构函数中崩溃。结果发现共享库正在将 Boost.Date_Time 对象输出到std::cout. 执行此操作时,库将std::cout.imbue使用 Boost.Date_Time 中的自定义构面对象(构面具有虚拟函数)创建新的语言环境。当库被卸载时,facet对象仍然属于该语言环境,但它的vtable指针引用了卸载的共享库中的虚拟表,这会导致销毁facet时崩溃。
| 归档时间: |
|
| 查看次数: |
5029 次 |
| 最近记录: |