Forum Programmation.c++ Undefined symbol

Posté par  .
Étiquettes : aucune
0
24
mar.
2009
Bonjour,

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  . Évalué à 1.

    bonjour,

    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  . Évalué à 1.

      Bonjour,

      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  (site web personnel) . Évalué à 3.

    Il faudrait donner un peu plus de détails:

    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  . Évalué à 2.

      Réponses pour tes questions:

      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  . Évalué à 1.

    Je vient de comprendre mon erreur.

    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.