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
.