On Windows, the HMODULE
returned from LoadLibrary
is the base pointer of the loaded DLL.
The shared library I use is a headless version of a game. To save its state, I parse the DLL to locate the .data
and .bss
sections, add their VAs to the DLL's base address, then copy the right amount of data from each section.
In principle, the same should be doable on Linux. However, I'm stuck on how to get the base address of a dlopen()
ed ELF library, since the void*
returned from dlopen()
is a pointer to the shared library's link_map
AFAIK.
How might I accomplish this?
EDIT 1: The "state" of the shared library is the state of all the static variables in it. To save that state, I copy the sections that contain them (.data
and .bss
) to an alternate buffer (in memory). When I restore that state, I write the alternate buffer's data back to the shared library's .data
and .bss
.