If I use dlopen on the same lib/file two times in the same application-run, will it yield the same handle in both cases? Is there any guarantee for this (a short experiment showed that it at least does on my box)?
I’m currently playing around with a little plugin-system (out of curiosity) and if there would be some kind of guarantee for this observed behaviour I could use this address as a key for a plugin to prevent duplicated loads.
Yes. The dlopen(3) linux man page says:
BTW, on Linux systems, you can dlopen a lot (many dozens of thousands) of shared libraries, as my example manydl.c demonstrates. The main limitation is address space.
So practically, not bothering about
dlclose-ing stuff is possible.(unless your dlopen-ed shared libraries have weird or resource consuming constructor or destructor functions)
Added in December 2017:
Notice that what is relevant is the exact path string passed to
dlopen. So if you use"./foo.so"and"././foo.so"(or"../foosymlink.so"wherefoosymlink.sois a symlink tofoo.so) the dlopen-ed handles are different, and in some cases weird behavior of the two instances of that shared library might happen.added in june 2019:
Read also Drepper’s How to write shared libraries paper (it explains also well how to use them!).