获取 dlopen'd 库的基址



在Windows操作系统下,LoadLibrary返回的HMODULE是加载的DLL的基指针。

我使用的共享库是一个游戏的无头版本。为了保存其状态,我解析DLL以找到.data.bss部分,将它们的va添加到DLL的基址,然后从每个部分复制适量的数据。

原则上,在Linux上也应该是可行的。然而,我被困在如何获得dlopen()ed ELF库的基址,因为从dlopen()返回的void*是指向共享库的link_map的指针。

我该如何做到这一点?

编辑1:"state"共享库中所有静态变量的状态。为了保存这种状态,我将包含它们的部分(.data.bss)复制到一个备用缓冲区(在内存中)。当我恢复该状态时,我将备用缓冲区的数据写回共享库的.data.bss

读取并解析/proc/self/maps文件

也就是说,通过转储非协作库的数据部分来保存其状态的概念是相当值得怀疑的。想象有一个指针。它指向数据节中的其他变量。从控制程序的角度来看,你无法判断它是一个指针,它只是内存中的一个单词,纯粹偶然地包含了一个值,对应于一个有效地址。如果库被加载到其他地址,并且状态被恢复,那么该指针将不再有效。

最新更新