Zoh*_*r81 6 c++ macos dynamic-linking dlopen
基于c ++的运行进程是否可以使用重新加载基于c ++的动态库dlopen
.
正在运行的进程将轮询新版本的动态库(使用相同的API).一旦检测到此类文件,就会发生以下一系列操作:
dlclose
dlopen
dlsym
新加载的库设置函数指针变量.在最后一个阶段,我实际上获得了所需的API并将其放在我的主代码中的函数指针中,以便稍后使用.
但是,似乎我的程序在第三阶段后意外地崩溃了.是否可能该dlclose
部分在流程虚拟空间中留下旧库的一些残余?有没有更好的方法呢?
顺便说一句,在Windows中它使用LoadLibrary, FreeLibrary and GetProcAddress
而不是使用dlopen, dlclose and dlsym
.
好像我的程序在第三阶段后意外地崩溃了.是否可能该
dlclose
部分在流程虚拟空间中留下旧库的一些残余?
有可能的.具有函数指针的对象和具有在被卸载的库中定义的虚函数的对象将最终得到无效指针.更糟糕的是,可以将新方面附加到标准流(例如std::cout
),然后卸载实现方面的共享库.稍后在使用std::cout
不相关的地方时会崩溃(真实的故事).因此,您必须完全控制共享库的功能.
此外,dlopen
必须调用RTLD_LOCAL
,以便其他任何东西都不能(意外地)使用正在加载的共享库的符号并防止它被卸载.man dlopen
如果你做了这样的专长,你必须阅读并理解.
归档时间: |
|
查看次数: |
698 次 |
最近记录: |