Vous pouvez facilement vérifier où libb.so
devrait être avec ldd
commande:
$ ldd liba.so
linux-gate.so.1 => (0xb77b0000)
libb.so.1 => not found
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb75b6000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7572000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb742b000)
/lib/ld-linux.so.2 (0xb77b1000)
Si c'est not found
, chemin de libb.so
doit être ajouté à /etc/ld.so.conf
ou variable shell LD_LIBRARY_PATH
.
Une autre façon est de définir rpath
dans le liba.so
lui-même - il est fondamentalement codage en dur son chemin donc lorsque le binaire est démarré l'éditeur de liens dynamique sait où chercher les bibliothèques partagées.
Si rpath
est défini pas d'abord une recherche dans LD_LIBRARY_PATH
, puis les chemins mentionnés dans /etc/ld.so.conf
(ou /etc/ld.so.conf.d/). Après avoir ajouté à ls.so.conf
ne pas oublier d'exécuter /sbin/ldconfig
éditeur de liens dynamiques recherche les bibliothèques partagées dépendantes par leur soname
(si elle est définie) - si soname
est pas définie (avec -Wl, -soname, pour libb.so.1 exemple), il sera recherché par le nom de la bibliothèque. Exemple: libb.so.1.0
est votre bibliothèque actuelle, ayant soname
- libb.so.1
. Vous auriez normalement la structure des fichiers suivants:
libb.so -> libb.so.1
libb.so.1 -> libb.so.1.0
libb.so.1.0
où libb.so
et libb.so.1
sont des liens symboliques.
Vous créez généralement un lien vers libb.so
, lors de la création d'une application ou d'une autre bibliothèque, en fonction de libb.so
.
gcc -shared -Wl,-soname,liba.so.1 -o liba.so.1.2 -L/libb/path -lb
Lorsque l'application est lancée (ou dlopen est exécuté - votre cas) - l'éditeur de liens dynamique recherchera le fichier avec le nom libb.so.1
- la soname
de la bibliothèque dépendante, si le soname
est réglé, pas libb.so
.
C'est pourquoi vous avez besoin de ce lien symbolique libb.so.1
, pointant vers la bibliothèque actuelle.
Si vous utilisez ld.so.conf
et ldconfig
, il créera le lien symbolique avec le nom de soname
, pointant vers le fichier de bibliothèque, si ce lien symbolique est manquant.
Vous pouvez voir la page de manuel ld-linux pour plus d'informations utiles.
Si la bibliothèque se trouve, mais quelques-uns des symboles sont manquants, mais essayez d'
libb.so
avec
-Wl,--no-undefined
l'option
gcc -shared -Wl,-soname,libb.so.1 -Wl,--no-undefined -o libb.so.1.2
Il devrait vous donner une erreur si vous avez manqué de définir un symbole.
Vous dites: vous avez créé deux bibliothèques (-fPIC -shared), liba.so et libb.so. liba.so est lié de façon dinamique (ou devrait l'être ...) avec libb.so et l'utilise. Dans un programme X, vous essayez dlopen sur libb.so et tout va bien; un autre programme de test Y essaye de dlopen liba.so mais il échoue, néanmoins vous savez liba.so trouve libb.so correctement puisque vous avez essayé de supprimer libb.so et un autre problème est soulevé ... options que vous utilisez pour dlopen? – ShinTakezou
Vous avez tout compris. Pour le moment, nous n'utilisons aucune option, car dlopen est appelé à partir d'un programme sur lequel nous n'avons aucun contrôle. – johnnycrash
Que dit la commande 'ldd liba.so'? –