Will dlopen yield the same handle for two calls with the same file?

老子叫甜甜 提交于 2019-12-10 04:03:11

问题


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.


回答1:


Yes. The dlopen(3) linux man page says:

   If the same library is loaded again with dlopen(), the same file 
   handle is returned. The dl library maintains reference counts for 
   library handles, so a dynamic library is not deallocated until 
   dlclose() has been called on it as many times as dlopen() 
   has succeeded on it.

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" where foosymlink.so is a symlink to foo.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!).



来源:https://stackoverflow.com/questions/12148454/will-dlopen-yield-the-same-handle-for-two-calls-with-the-same-file

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!