GNU/Linux >> Tutoriels Linux >  >> Linux

utiliser RPATH mais pas RUNPATH ?

Lorsque vous expédiez un binaire, il est bon de fournir aux utilisateurs les moyens d'adapter le binaire aux spécificités de leur propre système, entre autres, en ajustant les chemins de recherche de la bibliothèque.

Un utilisateur peut généralement modifier LD_LIBRARY_PATH et /etc/ld.so.conf , les deux ayant une priorité inférieure à DT_RPATH , c'est-à-dire que vous ne pouvez pas remplacer ce qui est codé en dur dans le binaire, alors que si vous utilisez DT_RUNPATH à la place, un utilisateur peut le remplacer par LD_LIBRARY_PATH .

(FWIW, je pense ld.so.conf doit également prévaloir sur DT_RUNPATH , mais, quoi qu'il en soit, au moins nous avons LD_LIBRARY_PATH ).

De plus, je suis fortement en désaccord avec la suggestion ci-dessus d'utiliser DT_RPATH . IMO, il est préférable d'utiliser nether DT_RPATH pas DT_RUNPATH dans les binaires livrés.

à moins que

vous expédiez toutes vos bibliothèques dépendantes avec vos exécutables et souhaitez vous assurer que les choses JustWork(tm) après l'installation, dans ce cas utilisez DT_RPATH .


Mais pourquoi alors RPATH a été abandonné au profit de RUNPATH ?

Lorsque DT_RPATH a été introduit, il avait priorité sur tous les autres paramètres. Cela rendait impossible de remplacer le chemin de recherche des bibliothèques, même à des fins de développement. Par conséquent, un autre paramètre, LD_RUNPATH, a été introduit avec une priorité inférieure à LD_LIBRARY_PATH.

Plus de détails peuvent être trouvés dans le travail "Comment écrire des bibliothèques partagées" écrit par Ulrich Drepper .


La réponse de Chill est tout à fait exacte ; Je voulais simplement ajouter un peu de couleur, à partir d'une lecture récente de la source glibc ([master 8b0ccb2], en 2.17). Pour être clair, si une bibliothèque n'est pas trouvée à l'emplacement spécifié par un niveau donné, le niveau suivant est essayé. Si une bibliothèque est trouvée à un niveau donné, la recherche s'arrête.

Ordre de recherche de bibliothèque dynamique :

  1. DT_RPATH dans le binaire ELF, sauf si DT_RUNPATH est défini.
  2. Entrées LD_LIBRARY_PATH, sauf setuid/setgid
  3. DT_RUNPATH en binaire ELF
  4. /etc/ld.so.cache entrées, sauf si -z nodeflib est donné au moment de la liaison
  5. /lib, /usr/lib sauf -z nodeflib
  6. Terminé, "introuvable".

Linux
  1. Linux - Pourquoi utilisons-nous Su - Et pas seulement Su ?

  2. Comparer les répertoires mais pas le contenu des fichiers ?

  3. Commande introuvable dans Zsh, mais trouvée dans Bash ?

  4. Make install, mais pas dans les répertoires par défaut ?

  5. Exécutez le script avec rc.local :le script fonctionne, mais pas au démarrage

Pourquoi ne pas utiliser « qui » ? Quoi utiliser alors ?

Un script peut-il être exécutable mais pas lisible ?

Décompresser un fichier .gz pour obtenir un fichier texte mais obtenir un fichier binaire ? ?

Debian 11.3 est si bonne qu'il n'y a tout simplement aucune raison de ne pas l'utiliser

Core dumpé, mais le fichier core n'est pas dans le répertoire courant ?

Pourquoi utilisons-nous su - et pas seulement su ?