Le HOWTO sur les bibliothèques partagées explique la plupart des mécanismes impliqués et le manuel du chargeur dynamique donne plus de détails. Chaque variante unix a sa propre manière, mais la plupart utilisent le même format exécutable ( ELF ) et ont des lieurs dynamiques similaires (dérivés de Solaris). Ci-dessous, je vais résumer le comportement courant en mettant l’accent sur Linux. Consultez les manuels de votre système pour connaître l'histoire complète.
En résumé, lorsqu'il recherche une bibliothèque dynamique ( .so
fichier), l'éditeur de liens essaie:
- répertoires répertoriés dans la
LD_LIBRARY_PATH
variable d'environnement ( DYLD_LIBRARY_PATH
sous OSX);
- répertoires listés dans le rpath de l'exécutable ;
- les répertoires du chemin de recherche du système, qui (sous Linux au minimum) sont composés des entrées dans
/etc/ld.so.conf
plus /lib
et /usr/lib
.
Le rpath est stocké dans l'exécutable (c'est l' attribut DT_RPATH
ou DT_RUNPATH
dynamic). 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 in /opt/myapp/bin
et que son chemin d'accès est $ORIGIN/../lib:$ORIGIN/../plugins
alors, l'éditeur de liens dynamique recherchera dans /opt/myapp/lib
et /opt/myapp/plugins
). Le rpath est normalement déterminé lors de la compilation de l'exécutable, avec l' -rpath
option to ld
, mais vous pouvez le changer par la suite avec chrpath
.
Dans le scénario que vous décrivez, si vous êtes le développeur ou emballeur de l'application et l' intention qu'il soit installé dans une …/bin
, la …/lib
structure, puis liaison avec -rpath='$ORIGIN/../lib'
. Si vous installez un fichier binaire pré-construit sur votre système, placez la bibliothèque dans un répertoire du chemin de recherche ( /usr/local/lib
si vous êtes l'administrateur système, sinon un répertoire auquel vous vous ajoutez $LD_LIBRARY_PATH
), ou essayez chrpath
.
/lib64
et/usr/lib64
sont utilisés pour des binaires 64 bits et/lib
et/usr/lib
sont utilisés pour binaires 32 bits.ldconfig
.ldconfig
s'implique lorsque vous installez une bibliothèque.*.so
bibliothèques n’est pas le même que$PATH
. Le chemin de recherche est tel que donné par @enzotib dans leur réponse. Pour imprimer les chemins qui seront recherchés, lancezldconfig -v 2>/dev/null | grep -v ^$'\t'
./sbin/ldconfig
et cette autre magie d’Andrew Bate pour le faire tourner non-rootSous Linux, le comportement est expliqué dans la
ld(1)
page de manuella source
Je suis à peu près sûr que la réponse est ici
ldconfig
.http://linux.die.net/man/8/ldconfig
la source
Pour les applications en cours d'exécution, le fichier
/proc/1234/maps
contient toutes les bibliothèques liées dynamiquement.Où
1234
est le pid de l'exécutable en cours d'exécution.Linux suit LD_LIBRARY_PATH et d’autres variables, comme indiqué dans la réponse de Gilles.
la source