从进程中卸载/删除共享库

格雷厄姆

所以这是我的问题。我有一个在VM上运行的Linux程序,该VM通过dlopen使用OpenCL执行一些命令。在程序执行的大约一半时间内,它将进入休眠状态,并且在恢复时无法对GPU上的任何状态做出任何假设(实际上,驱动程序可能已重新加载,物理GPU可能已更改)。在调用休眠dlclose之前,这确实会卸载OpenCL内存区域(这是一件好事),但是不会卸载OpenCL使用的库(在这种情况下为cuda和nvidia库)。因此,当程序恢复并尝试重新启动所有内容时,一切都会失败。

因此,我正在寻找一种有效地取消链接/卸载OpenCL使用的共享库的方法,以便它可以正确地“重新启动”自身。请注意,在此过渡过程中,进程本身可以根据需要暂停(停止),但可能不会被杀死。
另外,假设我正在使用root用户访问权限,并且对我可以修改/触摸的文件几乎没有任何限制。

亚视

对于不太实际的短期解决方案,您可以尝试在已加载的库上强制执行重新初始化序列,和/或强制卸载。

libdl只是一个普通的库,您可以复制,修改和链接该库,而不必使用系统库。一种选择是禁用RTLD_NODELETE处理。另一个是给定库的运行DT_FINI/DT_INIT序列。

dl_iterate_phdr,如果有的话,可能不需要修改libdl就可以用来做同样的事情。

在libdl中四处浏览和/或使用LD_DEBUG(如果支持)(可能支持)可以阐明为什么不首先卸载它的原因。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章