web-dev-qa-db-fra.com

Comment spécifiez-vous l'emplacement des bibliothèques sur un binaire? (linux)

Pour cette question, je vais utiliser un exemple spécifique, mais en réalité cela généralise à peu près tout binaire sur linux qui semble incapable de trouver ses bibliothèques dépendantes. Donc, j'ai un programme qui ne fonctionnera pas à cause des bibliothèques manquantes:

./cart5: error while loading shared libraries: libcorona-1.0.2.so: cannot open shared object file: No such file or directory

ldd nous éclaire sur le sujet:

linux-vdso.so.1 =>  (0x00007fff18b01000)
libcorona-1.0.2.so => not found
libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.4.3/libstdc++.so.6 (0x00007f0975830000)
libm.so.6 => /lib/libm.so.6 (0x00007f09755af000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007f0975399000)
libc.so.6 => /lib/libc.so.6 (0x00007f0975040000)
libz.so.1 => /lib/libz.so.1 (0x00007f0974e2b000)
/lib64/ld-linux-x86-64.so.2 (0x00007f0975b36000)

Cependant, Corona est installé:

oliver@human$ find / -name libcorona-1.0.2.so 2> /dev/null

/usr/local/lib64/libcorona-1.0.2.so
/home/oliver/installed/corona-1.0.2/src/.libs/libcorona-1.0.2.so

Comment puis-je dire au binaire où chercher la bibliothèque "manquante"?

30
Mala

Pour un événement unique, définissez la variable LD_LIBRARY_PATH sur une liste de répertoires séparés dans lesquels effectuer une recherche. Ceci est analogue à PATH pour les exécutables, à ceci près que les répertoires système standard sont également recherchés après ceux spécifiés dans l'environnement.

LD_LIBRARY_PATH=/usr/local/lib64 ./cart5

Si vous avez un programme qui conserve les bibliothèques dans un emplacement non standard et que vous ne pouvez pas les trouver par vous-même, vous pouvez écrire un script wrapper:

#!/bin/sh
if [ -n "$LD_LIBRARY_PATH" ]; then
  LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64
else
  LD_LIBRARY_PATH=/usr/local/lib64
fi
export LD_LIBRARY_PATH
exec /path/to/cart5 "$@"

La liste des répertoires système standard est conservée dans /etc/ld.so.conf. Les systèmes récents permettent à ce fichier d'inclure d'autres fichiers; si le vôtre contient quelque chose comme include /etc/ld.so.conf.d/*.conf, créez un nouveau fichier appelé /etc/ld.so.conf.d/mala.conf contenant les répertoires que vous souhaitez ajouter. Après avoir modifié /etc/ld.so.conf ou un fichier inclus, exécutez /sbin/ldconfig pour que vos modifications prennent effet (ceci met à jour le cache).

(LD_LIBRARY_PATH s'applique également à de nombreux autres ordinateurs, y compris FreeBSD, NetBSD, OpenBSD, Solaris et Tru64. HP-UX a SHLIB_PATH et Mac OS X a DYLD_LIBRARY_PATH. /etc/ld.so.conf a des analogues sur la plupart des ordinateurs, mais l'emplacement et la syntaxe diffèrent davantage.)

41
Gilles

Si vous souhaitez éviter LD_LIBRARY_PATH, vous pouvez également le faire lors de la liaison:

gcc -o exename -L/path/to/dynamiclib/ -lnameofLib \
    -Wl,-R/path/to/dynamiclib/ sourceCode1.c ...

Le -Wl, ... est utilisé pour transmettre des commandes supplémentaires à l'éditeur de liens. Dans ce cas, avec -R, vous indiquez à l'éditeur de liens qu'il enregistre ce chemin en tant que "chemin de recherche par défaut" pour le .so.

Je garde des notes sur de nombreux petits conseils comme celui-ci sur mon site:

https://www.thanassis.space/tricks.html

15
ttsiodras

Cela indique que libcorona n’est pas installé dans le chemin correct. Déplacez le répertoire libcorona dans le bon chemin, le problème sera résolu.

0
Rathi