Undefined symbol quand vous essayez de charger une bibliothèque avec dlopen
Je suis en train de charger une bibliothèque partagée (plugin), j'ai été fournis (à code source fermé) avec dlopen sous Linux plate-forme ARM. Je suis en train de charger de cette façon:
void* handle = dlopen(<library_path>/<library_name>, RTLD_NOW);
Le résultat est un échec avec ce message:
Failed to load <library_path>/<library_name>: undefined symbol: <symbol_name>.
J'ai essayé de regarder à l'intérieur de la bibliothèque nm, mais il semble que le lib a été dépouillé, aucun indicateur n'a pu être trouvé. J'ai aussi essayé d'utiliser readelf -s, et, en fait, j'ai obtenu ce résultat:
12663: 00000000 0 NOTYPE GLOBAL DEFAULT UND <symbol_name>
Par la lecture autour, j'obtiens que readelf -s retourne tous les symboles, y compris ceux des symboles définis dans les bibliothèques référencées par.
Les réponses à cette question ne sont pas complètement clair pour moi: est-ce un symbole qui est censé être dans la bibliothèque et qui n'est pas là parce qu'il a été compilé de la mauvaise façon ou est-ce un symbole que je suis censé trouver un autre endroit? La sortie de readelf -d semble suggérer que je suis fournissant toutes les bibliothèques partagées. Peut cette erreur liées à une erreur dans la façon dont je compile mon fichier exécutable ou est-ce quelque chose n'est pas liée à la chargeur?
Aussi, j'ai lu à propos de la signification de chaque colonne, mais ces valeurs sont tout à fait étrange. Comment interprétez-vous que le symbole description? Pourquoi est l'adresse 0? Pourquoi est type NOTYPE?
nm -D
au lieu de simplement nm
.Êtes-vous plus précisément censé utiliser
RTLD_NOW
? Sinon, vous pouvez juste besoin de passer à RTLD_LAZY
.Arg! Je ne savais vraiment pas qu'. Le symbole est inscrit comme suit: U <symbol_name>.
eh bien, je ne sais pas pour certains, mais je pense qu'il est de loin préférable de comprendre pourquoi ce qui se passe et bon de remarquer. Le point est aussi l'apprentissage de toute façon.
Ce n'
file <name of so file>
retour? Si je le lance contre /lib/libm-2.11.1.donc, je reçois "ELF 32-bit LSB ..., dépouillé" et en cours d'exécution nm /lib/libm-2.11.1.so
j'ai "pas de symboles". Mais de faire ce que @n.m. dit, j'obtiens une liste de fonctions. Ils ont d'être visible sinon, comment ferait n'importe quel programme de travail.
OriginalL'auteur Luca Carlon | 2011-12-03
Vous devez vous connecter pour publier un commentaire.
undefined symbol: X signifie toujours que X doit être exportés de l'une des bibliothèques chargées, mais il ne l'est pas. Vous devriez chercher à savoir dans quelle bibliothèque demandé symbole et un lien vers elle.
Vous devriez savoir que ce message est toujours le résultat d'un problème avec la bibliothèque, ce n'est pas la faute. La bibliothèque devrait savoir comment obtenir tous ses symboles. Si ce n'est pas vous pouvez lier votre exécutable à la bibliothèque requise ainsi, lorsque vous chargez votre plugin, demandé symbole est déjà connu.
Cette erreur peut avoir plus complexe que de raison. Dans le cas où les deux plugin et d'application principaux sont des liens vers la bibliothèque, puis tente de lien, il pourrait finir avec les symboles non définis, de toute façon. Cela peut se produire si l'application principale et le plugin sont à l'aide de différentes version de bibliothèque (à savoir, le plugin utilise la plus récente). Ensuite, au point de chargement du plugin version antérieure est déjà chargé, de sorte chargeur suppose que tout est ok, mais la version la plus récente peut contenir des nouveaux symboles. Si le plugin utilise, vous obtiendrez undefined symbol erreurs.
OriginalL'auteur j_kubik