使用"dlopen"重新加载运行时库
Runtime library reloading using `dlopen`
正在运行的基于 c++ 的进程是否可以使用dlopen
重新加载基于 C++ 的动态库。
正在运行的进程轮询新版本的动态库(使用相同的 API)。 检测到此类文件后,将执行以下操作:
- 使用
dlclose
卸载旧库 - 较新的 dylib 将被复制并覆盖旧版本的文件。
- 该过程使用以下
dlopen
从该位置加载较新版本 - 根据新加载库中
dlsym
设置函数指针变量。
在最后阶段,我实际上获得了所需的 API,并将其放在主代码中的函数指针中以供以后使用。
但是,似乎我的程序在第三阶段后意外崩溃。dlclose
部分是否有可能在进程虚拟空间中留下一些旧库的残余? 有没有更好的方法可以做到这一点?
顺便说一下,在 Windows 中使用LoadLibrary, FreeLibrary and GetProcAddress
而不是dlopen, dlclose and dlsym
工作得很好。
似乎我的程序在第三阶段后意外崩溃。
dlclose
部分是否有可能在进程虚拟空间中留下一些旧库的残余?
这是可能的。具有函数指针的对象和在卸载的库中定义的虚函数的对象将以无效指针结束。更糟糕的是,可以将新的分面附加到标准流(例如std::cout
),然后卸载实现分面的共享库。后来,当在不相关的地方使用std::cout
时,它会崩溃(真实故事)。因此,您必须完全控制共享库的功能。
此外,dlopen
必须使用RTLD_LOCAL
调用,以便其他任何内容都不能(意外地)使用正在加载的共享库的符号并阻止其卸载。如果你做这样的壮举,你必须阅读和理解man dlopen
。
相关文章:
- std::原子加载和存储都需要吗
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 为什么加载SDF会导致Mobilizer创建闭环错误
- C++atioglxx.pdb未加载错误glBufferData OpenGL
- 如何使用tinyxml2从XML加载父实体和子实体
- 如何在C++中使用pybind11加载一个pickle python列表
- 系统.将数组移交给c#中动态加载的c++DLL时发生AccessViolationException
- 当我尝试加载内核模块时,如何修复C++中的这个 malloc() 错误?
- 树莓上的 Libtorch 无法加载 pt 文件,但在 ubuntu 上工作
- Python ctypes:不会按预期加载 dll
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 我的程序有一个保存配置文件的GUI,如何双击此配置文件以直接加载带有配置数据的GUI?
- 保存/加载大量短数组到二进制文件
- 使用 SDL2 和SDL_image C++加载图像
- 无法使用加载库卸载注入的 dll (C++)
- 是否有原子加载非原子值的函数?
- 将 bmp 文件加载到 TSpeedButton 中
- 如何使用Qt 3D库加载和显示搅拌机.obj源文件场景
- 加载与引用 .NET DLL 位于同一文件夹中的引用的 .NET DLL 时"Not found"异常