Symbole introuvable après un dlopen

Symbole introuvable après un dlopen - C++ - Programmation

Marsh Posté le 21-03-2008 à 07:59:11    

Bonjour,
Voici mon problème : je charge une bibliothèque dynamique via dlopen (on va l'appeler malib1 avec un fichier libmalib1.so). Cette bibliothèque utilise une autre bibliothèque dynamique (malib2, libmalib2.so). Le chargement via dlopen de malib1 se passe sans problème mais lorsque malib1 tente d'utiliser une fonction de malib2, je reçois un "symbol lookup error" me disant que la-dite fonction n'existe pas dans malib1.
Pour essayer de comprendre, j'ai remplacé l'appel à dlopen par un appel direct à malib1 et dans ce cas tout fonctionne parfaitement.  
Que dois-je faire pour que cela fonctionne ?
 
Petites précisions :
- Je suis sous Linux.
- J'utilise gcc 3.4.5.
- Mon LD_LIBRARY_PATH est correct. Je l'ai vérifié environ 1 millier de fois ;)
- Lors de la création de malib1, j'ai essayé avec et sans édition de lien dynamique vers malib2, ça ne change rien. Pour être clair, j'ai essayé avec et sans l'option -lmalib2. Maintenant je pense que c'est normal qu'il n'y ait pas de différence étant donné qu'un .so n'est pas linké et que les options -l ne sont utilisées que lors du link. Me trompe-je ?
- Si j'effectue une édition de lien dynamique avec malib2 dans l'application principale, ça marche (ça confirme le fait que le problème est lié à dlopen) mais ce n'est vraiment pas ce que je veux. Si malib1 a besoin de nouvelles bibliothèques à l'avenir je ne veux pas être obligé de recompiler mon application à chaque fois !
- Si j'utilise 'nm' sur malib2.so, je vois que la fonction appelée est définie dans la "text section" (T). Est-ce normal ?
- Si j'utilise 'nm' sur malib1.so, je vois que la fonction appelée est indéfinie (U). Je pense que c'est normal au vu des résultats d'autres appels à 'nm' sur des binaires utilisant des bibliothèques dynamiques.
- J'ai essayé de linker l'application avec l'option -rdynamic (cf. man dlopen) mais ça ne change rien.
 
J'espère que quelqu'un pourra m'aider car je ne vois plus quoi faire.

Reply

Marsh Posté le 21-03-2008 à 07:59:11   

Reply

Marsh Posté le 21-03-2008 à 21:47:30    

appelle dlopen avec le path complet, d'abord, pour être sûr que tu as la bonne bibliothèque.
 
Ensuite, regarde les paramètres de dlopen, il y a une option pour ouvrir la librairie soit publiquement (accessible par toutes les librairies) soit de façon privée (accessible par le programme principal seulement).
 
Enfin, si ça ne fontionne toujours pas, poste le code.

Reply

Marsh Posté le 28-03-2008 à 08:42:24    

Il n'y a pas de problème de path. L'erreur renvoyée par dlopen contient le chemin du .so chargé et c'est bien ma bibliothèque.
 
En ce qui concerne l'option de dlopen, je suppose que c'est RTLD_GLOBAL. C'est une précision que j'ai oublié : j'ai fait l'essai avec et sans RTLD_GLOBAL et ça ne change rien.
 
Voici l'appel à dlopen :


            // load the plugin library
            pluginHdl.handler = dlopen(PpluginPath.c_str(), RTLD_LAZY | RTLD_GLOBAL);
            if (!pluginHdl.handler) {
                throw PluginException(std::string("Cannot load library: " ) + dlerror());
            }


Voici l'erreur :

Cannot load library: /.../malib1.so: undefined symbol: _ZTV11QcException"


Le symbole en question (QcException) est défini dans malib2.so qui est bien dans le LD_LIBRARY_PATH.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed