GNU/Linux >> Tutoriels Linux >  >> Linux

Où les exécutables recherchent-ils les objets partagés lors de l'exécution ?

Je comprends comment définir inclure des objets partagés au moment de la liaison/compilation. Cependant, je me demande toujours comment les exécutables recherchent l'objet partagé (*.so bibliothèques) au moment de l'exécution.

Par exemple, mon application a.out appelle les fonctions définies dans la lib.so bibliothèque. Après compilation, je déplace lib.so vers un nouveau répertoire dans mon $HOME .

Comment puis-je dire a.out aller le chercher là-bas ?

Réponse acceptée :

Le HOWTO de la bibliothèque partagée explique la plupart des mécanismes impliqués, et le manuel du chargeur dynamique va plus en détail. Chaque variante Unix a sa propre manière, mais la plupart utilisent le même format exécutable (ELF) et ont des liens dynamiques similaires¹ (dérivés de Solaris). Ci-dessous, je résumerai le comportement courant en mettant l'accent sur Linux; consultez les manuels de votre système pour l'histoire complète.

(Note terminologique :la partie du système qui charge les bibliothèques partagées est souvent appelée « éditeur de liens dynamique », mais parfois « chargeur dynamique » pour être plus précis. « Éditeur de liens dynamique » peut également désigner l'outil qui génère des instructions pour le chargeur dynamique lors de la compilation. un programme, ou la combinaison de l'outil de compilation et du chargeur d'exécution. Dans cette réponse, "l'éditeur de liens" fait référence à la partie d'exécution.)

En un mot, lorsqu'il recherche une bibliothèque dynamique (.so file) l'éditeur de liens essaie :

  • répertoires listés dans le LD_LIBRARY_PATH variable d'environnement (DYLD_LIBRARY_PATH sur OSX);
  • répertoires répertoriés dans le rpath de l'exécutable ;
  • répertoires sur le chemin de recherche du système, qui (sur Linux au moins) se compose des entrées dans /etc/ld.so.conf plus /lib et /usr/lib .

Le rpath est stocké dans l'exécutable (c'est le DT_RPATH ou DT_RUNPATH attribut dynamique). Il peut contenir des chemins absolus ou des chemins commençant par $ORIGIN pour indiquer un chemin relatif à l'emplacement de l'exécutable (par exemple si l'exécutable est dans /opt/myapp/bin et son rpath est $ORIGIN/../lib:$ORIGIN/../plugins alors l'éditeur de liens dynamique cherchera dans /opt/myapp/lib et /opt/myapp/plugins ). Le rpath est normalement déterminé lors de la compilation de l'exécutable, avec le -rpath option pour ld , mais vous pouvez le modifier par la suite avec chrpath .

Dans le scénario que vous décrivez, si vous êtes le développeur ou le conditionneur de l'application et que vous avez l'intention de l'installer dans un …/bin , …/lib structure, puis lien avec -rpath='$ORIGIN/../lib' . Si vous installez un binaire pré-construit sur votre système, placez la bibliothèque dans un répertoire sur le chemin de recherche (/usr/local/lib si vous êtes l'administrateur système, sinon un répertoire que vous ajoutez à $LD_LIBRARY_PATH ), ou essayez chrpath .


Linux
  1. Où placer un exécutable local ?

  2. Comment rechercher les codes de sortie pour les applications ?

  3. Linux - Problèmes d'autorisations pour le répertoire partagé sur un serveur ?

  4. "quel" équivalent pour les bibliothèques partagées ?

  5. Mécanismes de verrouillage pour la cohérence de la mémoire partagée

6 nouvelles fonctionnalités ShellHub passionnantes à rechercher en 2021

Tutoriel de commande Linux look pour les débutants (avec exemples)

Configurations d'adresses IP statiques et dynamiques pour DHCP

Comment répertorier les bibliothèques partagées utilisées par les exécutables sous Linux

Où est l'exécutable PHP sur Ubuntu ?

Où Django recherche-t-il l'instance SQLite ? (SQLite 3.8.3 ou version ultérieure est requis (trouvé 3.7.17))