Bibliothèque partagée qui utilise une bibliothèque partagée symbole non défini
deux bibliothèques partagées liba.donc, et libb.. liba.utilise donc libb.. Tous les c, les fichiers sont compilés avec -fPIC. La liaison utilise partagés. Lorsque nous appelons dlopen sur liba.il ne peut donc pas trouver des symboles dans libb.donc...nous obtenons le "undefined symbol" erreur. Nous pouvons dlopen libb.donc, avec pas d'erreurs. Nous savons qu'il est de trouver libb parce que nous n'avons pas d'obtenir un fichier ne trouve pas d'erreur. Nous obtenons un fichier n'est pas trouvé d'erreur lorsqu'on les supprime libb.. Nous avons essayé -lutil et pas de chance.
Des idées????
oh ouais. gcc 4.1.2
mise à jour: Nous utilisons rpath lors de la liaison de liba afin de trouver libb.
ldd liba.donc retourne:
linux-gate.so.1 => (0xffffe000)
libb.so => ./libb.so (0xf6ef9000) <-------- LIBB
libutil.so.1 => /lib/libutil.so.1 (0xf6ef5000)
libdl.so.2 => /lib/libdl.so.2 (0xf6ef1000)
libm.so.6 => /lib/libm.so.6 (0xf6ec9000)
libpthread.so.0 => /lib/libpthread.so.0 (0xf6eb1000)
librt.so.1 => /lib/librt.so.1 (0xf6ea8000)
libc.so.6 => /lib/libc.so.6 (0xf6d62000)
/lib/ld-linux.so.2 (0x007d0000)
est-il significat qu'il n'existe pas .# à la fin de libb???
Vous l'avez tous droit. Droit maintenant, nous n'utilisons pas d'options, parce que dlopen est appelée à partir d'un programme, nous n'avons aucun contrôle sur.
Ce n'commande
ldd liba.so
dire?ldd dit libb.donc => ./libb.(0xf6ef9000), parmi d'autres choses. Toutes les autres lignes ont un supplément .# après le nom, comme "libutil..1 => /lib/libutil..1 (0xf6ef5000)." Est-il significat qu'il n'existe pas .# après libb.alors???
Dans ce cas, vous devez vérifier que le symbole de la définition - si elle est définie ou tout simplement déclaré
OriginalL'auteur johnnycrash | 2010-06-07
Vous devez vous connecter pour publier un commentaire.
Vous pouvez facilement vérifier où
libb.so
devrait être avecldd
commande:Si c'est
not found
,libb.so
'chemin d'accès doit être ajouté à/etc/ld.so.conf
ou variable shellLD_LIBRARY_PATH
.Une autre façon est de paramètre
rpath
dans leliba.so
lui-même -, c'est essentiellement le coder en dur son chemin alors, quand le binaire est commencé à l'éditeur de liens dynamique permettrait de savoir où chercher pour les bibliothèques partagées.Si
rpath
n'est pas défini, il sera d'abord rechercher dansLD_LIBRARY_PATH
, puis les chemins mentionnés dans/etc/ld.so.conf
(ou /etc/ld..conf.d/). Après l'ajout dels.so.conf
n'oubliez pas d'exécuter/sbin/ldconfig
L'éditeur de liens dynamiques recherches dépendante des bibliothèques partagées par leurs
soname
(si elle est définie) - sisoname
n'est pas définie (avec -Wl,-soname,libb..1 par exemple), il sera recherché par la bibliothèque du nom.Exemple:
libb.so.1.0
est votre bibliothèque réelle, ayantsoname
-libb.so.1
. Vous auriez normalement les fichiers suivants de la structure:où
libb.so
etlibb.so.1
sont des liens symboliques.Vous habituellement lien vers
libb.so
, lors de la construction d'une application ou d'une autre bibliothèque, selonlibb.so
.Lorsque l'application est démarrée (ou dlopen est exécuté - votre cas) - l'éditeur de liens dynamique recherche de fichier avec le nom
libb.so.1
- lesoname
des personnes dépendantes de la bibliothèque, si lasoname
est défini, paslibb.so
.C'est pourquoi vous avez besoin de ce lien symbolique
libb.so.1
, pointant à la bibliothèque réelle.Si vous utilisez
ld.so.conf
etldconfig
, il va créer le lien symbolique avecsoname
nom, pointant vers le fichier de la bibliothèque, si ce lien symbolique est manquant.Vous pouvez voir ld-linux page de manuel pour plus d'informations utiles.
Si la bibliothèque est trouvé mais certains symboles sont manquants, essayez de créer
libb.so
avec-Wl,--no-undefined
optionIl devrait vous donner une erreur si vous avez manqué de définir un symbole.
Bravo pour rpath....mais pas notre problème.
je n'aurais pas compris la partie sur le soname...pouvez-vous préciser un peu?
voir mon montage, j'ai essayé de donner plus de détails.
Je vais déconner avec ça et voir ce qui se passe. Aussi, il utilise libb. L'application appelle dlopen(liba) et obtient l'erreur sur un symbole utilisé par liba qui est en libb.
OriginalL'auteur Dmitry Yudakov
Ne pas oublier que les libs de commande (lxxx arguments) sont importantes (au moins dans gcc) lors de la liaison de tous vos objs & bibliothèques pour générer l'exécutable.
Court exemple:
qui peut échouer dans certains cas, tandis que
ne
OriginalL'auteur Vincent Fenet