Découvrez si la bibliothèque est sur le chemin

15

En supposant que je veux tester si une bibliothèque est installée et utilisable par un programme. Je peux utiliser ldconfig -p | grep mylibpour savoir s'il est installé sur le système. mais que se passe-t-il si la bibliothèque n'est connue que via le paramètre LD_LIBRARY_PATH?

Dans ce cas, le programme pourra peut-être trouver la bibliothèque, mais ldconfigne le fera pas. Comment puis-je vérifier si la bibliothèque se trouve dans le chemin de l'éditeur de liens combiné ?

J'ajouterai que je recherche une solution qui fonctionnera même si je n'ai pas réellement le programme à portée de main (par exemple le programme n'est pas encore compilé), je veux juste savoir qu'une certaine bibliothèque existe dans ld' s chemins.

nbubis
la source
2
Vous pouvez utiliser ldd <binary>pour vérifier si toutes les bibliothèques liées se trouvent dans le chemin. Il y a peut-être une façon plus élégante.
Thomas
@Thomas Je pense que vous devriez répondre à votre commentaire. lddsert exactement ce but.
lgeorget
1
@Thomas - mais que se passe-t-il si le programme n'est pas encore compilé et que cette bibliothèque est nécessaire pour la compilation?
nbubis
@Igeorget - voir ma modification / commentaire
nbubis
@nbubis: lorsque vous avez besoin de la bibliothèque pour la compilation, vous devez normalement utiliser LIBRARY_PATHune variable d'environnement qui est recherchée par exemple par le gcccompilateur. La LIBRARY_PATHvariable d'environnement possède également une liste de répertoires séparés par deux points.
Thomas

Réponses:

15

ldconfig peut répertorier toutes les bibliothèques auxquelles il a accès. Ces bibliothèques sont également stockées dans son cache.

/sbin/ldconfig -v -Nva explorer tous les chemins de bibliothèque habituels, répertorier toutes les bibliothèques disponibles, sans reconstruire le cache (ce qui n'est pas possible si vous n'êtes pas un utilisateur root). Il ne prend PAS en compte les bibliothèques dans LD_LIBRARY_PATH (contrairement à ce que ce message a dit avant de modifier), mais vous pouvez passer des bibliothèques supplémentaires à la ligne de commande en utilisant la ligne ci-dessous:

/sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH)
lgeorget
la source
ldconfig est un outil des années 80 abandonné dans les années 90. Pour cette raison, il ldconfign'est pas portable car il ne s'applique qu'aux implémentations basées sur l' a.outéditeur de liens dynamique basé sur SunOS-4.0 de 1987.
schily
Comment cela aide-t-il à répertorier les bibliothèques qui se trouvent uniquement sur LD_LIBRARY_PATH? Je suppose que je pourrais écrire un script pour analyser cela, puis le lire via ldconfig, mais cela ressemble un peu à un sur-tuer.
nbubis
1
@nbubis, vous pouvez toujours transmettre les bibliothèques de LD_LIBRARY_PATH à ldconfig. Comme /sbin/ldconfig -N -v $(sed 's/:/ /' <<< $LD_LIBRARY_PATH)pas trop d'une exagération à mon goût.
lgeorget
@schily Vraiment? Pour autant que je sache, cela fonctionne assez bien avec les bibliothèques ELF. Et il est toujours utilisé, ld.so s'appuie sur le cache construit par ldconfig.
lgeorget
Les gens de Linux ont piraté l'ancien code source de l'éditeur de liens Sun pour prendre en charge ELF. La nouvelle implémentation ELF de Sun a été supprimée ldconfigdans un accord avec AT&T car la mise en cache de l'éditeur de liens était trop sensible aux erreurs. Sun a ajouté plus tard the tree stooges: moe, lariet crleque les programmes d'aide pour la gestion ELF.
schily
2

Substitut :global (espace) pour avec LD_LIBRARY_PATH

/sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH)
fizwit
la source
2

Vous pouvez compiler un programme de test simple avec gcc et lier votre bibliothèque. Ensuite, vous pouvez vérifier les bibliothèques utilisées avec ldd. J'utilise quelque chose comme ça:

echo "int main(){}" | gcc -x c++ -Wl,--no-as-needed -lmylib - && ldd a.out | grep mylib

-Wl,--no-as-needed empêche l'éditeur de liens de supprimer la bibliothèque, car aucun symbole de la bibliothèque n'est utilisé.

guini
la source