Dans le cadre de mon projet de création d'un système de SAN libre, je suis confronté a un problème et j'ai besoin de l'avis d'expert.
Mon programme passe correctement la compillation et la liaison. Mon soucis vient du fait que lorsque je tente de charger une librairie .so, le message suivant apparait :
$ ./nettest
./nettest: symbol lookup error: /usr/src/evs/.libs/libVersionMapper.so: undefined symbol: _ZN6WorkerC2EP6Engine
Là, vous me direz : il a oublier de présiser un truc du genre extern "C" pour que cela marche.
Ca me semble plus compliqué que cela , voyez vous même :
$ nm ./nettest | grep _ZN6WorkerC2EP6Engine
08051af0 t _GLOBAL__I__ZN6WorkerC2EP6Engine
08051ea0 T _ZN6WorkerC2EP6Engine
On voie bien que le symbol manquant est bien présent dans le binaire que je lance. De plus, si j'utilise la class avant de charger la librairie, je n'ai plus le problème.
Pouvez vous m'indiqué la voie ?
Merci
# dlopen
Posté par goeb . Évalué à 1.
je n'ai pas de solution, mais voici 2 pistes :
utilises-tu les bonnes options pour le dlopen ? (RTLD_GLOBAL,...)
aurais-tu le symbole _ZN6WorkerC2EP6Engine en double ?
[^] # Re: dlopen
Posté par DeadMaXfr . Évalué à 1.
Merci pour ces pistes, mais c'est pas ça.
J'utilise bien RTLD_GLOBAL mais avec RTLD_LAZY.
Il n'y a pas de doublon sur ce symbole.
Personnellement, je penche pour le flag RTLD_LAZY. Il semble que si le programme n'utilise pas la class avant le chargement, alors le chargement de la librairie exploitant cette même class ne fonctionne pas.
J'essaye de confirmer ça ce matin.
# Détails?
Posté par JoeltheLion (site web personnel) . Évalué à 3.
1) la librairie, elle est de toi ou elle est extérieure? Est-ce qu'elle définit le même symbole?
2) Tu es sûr d'avoir utilisé la même librairie au link et à l'exécution?
3) Qu'est-ce que tu appelles "charger la librairie"? Tu utilises dlopen?
Un bout de code minimal qui présente le problème serait pas mal non plus...
[^] # Re: Détails?
Posté par DeadMaXfr . Évalué à 2.
1) La librairie est de moi, et oui, c'est bien le même symbole.
2) Oui, j'utilise les libtools avec kdevelop.
3) Oui, je charge les librairies avec dlopen. Les options que j'utilise sont RTLD_LAZY et RTLD_GLOBAL.
Pour le code minimal, je n'arrive pas à reproduire le bug avec quelque ligne.
J'essaye ce matin.
# Résolu
Posté par DeadMaXfr . Évalué à 1.
J'ai juste oublié le flag -rdynamic
Dans on souhaite qu'une librairie utilise le contenu du binaire, il faut ajouter -rdynamic au linker.
Merci
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.