Est-ce que dlopen donnera le même handle pour deux appels avec le même fichier?

Si j’utilise dlopen sur le même fichier lib / deux fois dans la même application, cela donnera-t-il le même handle dans les deux cas? Y a-t-il une garantie pour cela (une courte expérience a montré que cela se produisait au moins sur ma boîte)?

Je suis en train de jouer avec un petit système de plugin (par curiosité) et s’il y avait une sorte de garantie pour ce comportement observé, je pourrais utiliser cette adresse comme clé pour un plugin pour éviter les charges dupliquées.

Oui. La page de manuel de linux dlopen (3) dit:

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, sur les systèmes Linux, vous pouvez ouvrir beaucoup (plusieurs dizaines de milliers) de bibliothèques partagées, comme le montre mon exemple manydl.c . La principale limitation est l’espace d’adressage. Donc, pratiquement, il est possible de ne pas se soucier des choses dlclose .

(sauf si vos bibliothèques partagées dlopen-ed ont des fonctions de constructeur ou de destructeur étranges ou consommant des ressources)

Ajouté en décembre 2017:

Notez que ce qui est pertinent est la chaîne de chemin d’access exacte passée à dlopen . Donc, si vous utilisez "./foo.so" et "././foo.so" (ou "../foosymlink.so"foosymlink.so est un lien symbolique vers foo.so ), les poignées dlopen-ed sont différentes , et dans certains cas, un comportement étrange des deux instances de cette bibliothèque partagée peut se produire.