Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从进程卸载/删除共享库_C_Linux_Linker_Shared Libraries - Fatal编程技术网

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

C 从进程卸载/删除共享库,c,linux,linker,shared-libraries,C,Linux,Linker,Shared Libraries,这就是我的问题。我有一个Linux程序在VM上运行,它通过dlopen使用OpenCL执行一些命令。在程序执行的一半左右,它将进入休眠状态,在恢复时,它不能对GPU上的任何状态做出任何假设(事实上,驱动程序可能已重新加载,物理GPU可能已更改)。在休眠之前,会调用dlclose,这会卸载OpenCL内存区域(这是一件好事),但OpenCL使用的库(本例中为cuda和nvidia库)不会卸载。因此,当程序恢复并尝试重新调整所有内容时,一切都会失败。 因此,我要寻找的是一种有效地取消链接/卸载Ope

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

因此,我要寻找的是一种有效地取消链接/卸载OpenCL正在使用的共享库的方法,以便它能够正确地“重启”自己。需要注意的是,进程本身可以在此转换过程中暂停(停止)所需的时间,但不能终止。

另外,假设我正在使用根访问权限,并且对我可以修改/触摸的文件或多或少没有限制。

如果它们没有卸载,这可能是因为某些东西保留了对它们的引用,或者它们设置了
节点标记,或者因为
dlclose
的实现由于其他原因不支持卸载它们。请注意,
dlclose
不要求卸载任何内容:

应用程序编写器可以使用dlclose()对流程的一部分进行意向声明,但该声明不会对实现产生任何要求。关闭符号表句柄时,实现可能会卸载打开符号表句柄时由dlopen()加载的可执行对象文件,以及使用句柄标识的符号表句柄时由dlsym()加载的可执行对象文件

资料来源:

您所遇到的问题表明,在用户空间过程中加载图形驱动程序是一个非常糟糕的主意,但解决这一问题是一个技术和政治挑战(许多人反对解决这一问题)


唯一短期可行的解决方案可能是将使用这些库的代码分解为一个单独的进程,您可以终止并重新启动该进程,并通过某种IPC机制与之对话,或者简单地让整个程序序列化其状态并在恢复时重新执行自身。

如果它们不卸载,这可能是因为某些东西保留了对它们的引用,或者它们设置了
nodelete
标志,或者是因为
dlclose
的实现由于某些其他原因不支持卸载它们。请注意,
dlclose
不要求卸载任何内容:

应用程序编写器可以使用dlclose()对流程的一部分进行意向声明,但该声明不会对实现产生任何要求。关闭符号表句柄时,实现可能会卸载打开符号表句柄时由dlopen()加载的可执行对象文件,以及使用句柄标识的符号表句柄时由dlsym()加载的可执行对象文件

资料来源:

您所遇到的问题表明,在用户空间过程中加载图形驱动程序是一个非常糟糕的主意,但解决这一问题是一个技术和政治挑战(许多人反对解决这一问题)


唯一短期可行的解决方案可能是将使用这些库的代码分解为一个单独的进程,您可以终止并重新启动该进程,并通过某种IPC机制与之对话,或者简单地让整个程序序列化其状态并在恢复时重新执行自己。

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

libdl只是一个普通的库,您可以对其进行复制、修改和链接,而不用使用系统库。一个选项是禁用
RTLD\u NODELETE
处理。另一个是为给定库运行
DT_FINI
/
DT_INIT
序列

dl\u iterate\u phdr
(如果可用)可以用于执行相同的操作,而无需修改libdl


在libdl中翻找和/或使用
LD_DEBUG
(如果支持的话)可能有助于了解为什么不首先卸载它。

对于短期实用的解决方案,您可能可以尝试在加载的库上强制重新初始化序列,和/或强制卸载

libdl只是一个普通的库,您可以对其进行复制、修改和链接,而不用使用系统库。一个选项是禁用
RTLD\u NODELETE
处理。另一个是为给定库运行
DT_FINI
/
DT_INIT
序列

dl\u iterate\u phdr
(如果可用)可以用于执行相同的操作,而无需修改libdl

浏览libdl和/或使用
LD_DEBUG
(如果支持的话)可能有助于了解为什么不首先卸载它