78 votes

Vous ne trouvez pas le fichier .so dans le même répertoire que l'exécutable ?

J'ai un exécutable qui doit être lié avec libtest.so dynamiquement, donc je les ai mis dans le même répertoire, puis :

cd path_to_dir
./binary

Mais j'ai eu ça :

error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory

Comment peut-il être incapable de trouver libtest.so qui se trouve déjà dans le même répertoire que l'exécutable lui-même ?

2voto

Subin Points 111

Je l'ai fait fonctionner avec ce :

$ gcc file.c -L. -lmylib

et de courir :

$ LD_LIBRARY_PATH=. ./a.out

2voto

Patrizio Bertoni Points 121

Il peut y avoir des situations subtiles présentant les mêmes symptômes. J'ai l'habitude de construire un projet CMake, à la fois localement à /path/to/myproj et à distance sur un serveur, à /path/to/myproj-deploy . Le projet contient un .so artefact de construction et plusieurs fichiers ELF qui en dépendent.

Lorsque j'ai récupéré les binaires du serveur de construction, j'ai découvert que l'appel (local) des ELFs entraîne les mêmes problèmes. Merci à authomatthias en appelant

$ objdump -p bin/myelf  | grep my
bin/myelf:     file format elf64-x86-64
  NEEDED               libmyso.so
  RUNPATH              /path/to/myproj-deploy/bin

aboutit à une conséquence non surprenante : Le système CMake a codé en dur le chemin à distance dans le fichier RUNPATH ce qui démontre une certaine non-portabilité (sans actions supplémentaires appropriées, je suppose).

1voto

Mecki Points 739

L'éditeur de liens dynamiques décidera où chercher les bibliothèques. Dans le cas de Linux, l'éditeur de liens dynamiques est généralement GNU ld.so (ou une alternative qui se comportera généralement de manière identique pour des raisons de compatibilité).

Pour citer la Wikipedia :

L'éditeur de liens dynamiques de la bibliothèque C de GNU recherche les bibliothèques partagées. dans les emplacements suivants :

  1. Les chemins d'accès (séparés par des deux points) dans le fichier DT_RPATH l'attribut de section dynamique du binaire, s'il est présent, et l'élément DT_RUNPATH L'attribut n'existe pas.
  2. Les chemins (séparés par deux points) dans la variable d'environnement LD_LIBRARY_PATH sauf si l'exécutable est un setuid / setgid binaire, en auquel cas il est ignoré. LD_LIBRARY_PATH peut être surchargée en appelant l'éditeur de liens dynamiques avec l'option --library-path (par ex. /lib/ld-linux.so.2 --library-path $HOME/mylibs monprogramme).
  3. Les chemins d'accès (séparés par des deux points) dans le fichier DT_RUNPATH attribut de section dynamique du binaire s'il est présent.
  4. Recherche basée sur le Fichier cache ldconfig (souvent situé à /etc/ld.so.cache ) qui contient une liste compilée de candidats précédemment trouvées dans le chemin de la bibliothèque augmentée (défini par la commande /etc/ld.so.conf ). Si, par contre, le binaire était lié à l'option -z nodefaultlib l'option de liaison, les bibliothèques dans les chemins de bibliothèques par défaut sont sont ignorées.
  5. Dans le chemin de confiance par défaut /lib et ensuite /usr/lib . Si le binaire a été lié avec l'option de liaison -z nodefaultlib, cette étape est sautée. sautée.

出典 https://en.wikipedia.org/wiki/Rpath

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X