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 :
- DT_RPATH dans le binaire ELF, sauf si DT_RUNPATH est défini.
- Entrées LD_LIBRARY_PATH, sauf setuid/setgid
- DT_RUNPATH en binaire ELF
- /etc/ld.so.cache entrées, sauf si -z nodeflib est donné au moment de la liaison
- /lib, /usr/lib sauf -z nodeflib
- Terminé, "introuvable".