I have 3 things: open source application (let’s call it APP),
closed source shared library (let’s call it OPENGL)
and open source plugin for OPENGL (let’s call it PLUGIN)[also shared library].
OS: Linux.
There is need to share data between APP and PLUGIN,
so APP linking with PLUGIN, and when I run it,
system load it automatically.
After that APP call eglInitialize that belongs to OPENGL,
and after that this function load PLUGIN again.
And after that I have two copies of PLUGIN in the APP memory.
I know that because of PLUGIN have global data, and after debugging
I saw that there are two copies of global data.
So question how I can fix this behaviour?
I want one instance of PLUGIN, that used by APP and OPENGL.
And I can not change OPENGL library.
I suspect that OPENGL is loading PLUGIN with the
RTLD_LOCALflag. Thisis normally what you want when loading a plugin, so that multiple
plugins don’t conflict.
We’ve had similar problems with loading code under Java: we’d load a
dozen or so different modules, and they couldn’t communicate with one
another. It’s possible that our solution would work for you: we wrote a
wrapper for the plugin, and told Java that the wrapper was the plugin.
That plugin then loaded each of the other shared objects, using
dlopenwith
RTLD_GLOBAL. This worked between plugins. I’m not sure that itwill allow the plugins to get back to the main, however (but I think it
should). And IIRC, you’ll need special options when linking main for
its symbols to be available. I think Linux treats the symbols in main
as if main had been loaded with
RTLD_LOCALotherwise. (Maybe--export-dynamic? It’s been a while since I’ve had to do this, and Ican’t remember exactly.)