Dernière mise-à-jour :

102.3 - Gérer les bibliothèques partagées (1/60)

Les Bibliothèques Partagées

Présentation

Introduction

Les bibliothèques partagées sont des fonctions communes à plusieurs programmes différents d'un même domaine (son, base de données, vidéo etc.). Les fonctions proposées par une ou plusieurs bibliothèques forment un API (Application Programming Interface). Sous Linux les bibliothèques se nomment Shared Objects et portent le suffixe .so.

Stockage

Les bibliothèques partagées sont stockées par convention dans des répertoires lib, par exemple :

Répertoire	Contenu
/lib	Bibliothèques du système de base
/usr/lib	Bibliothèques utilisateurs
/usr/local/lib	Bibliothèques locales
/usr/X11R6/lib	Bibliothèques de l'environnement X
/opt/kde4/lib	Bibliothèques de KDE

Important : La bibliothèque la plus importante est libc. Sans elle, le système Linux ne peut pas fonctionner.

ld-linux.so.2

La bibliothèque ld-linux.so.2 est utilisée par le système pour créer un lien avec une bibliothèque partagée au moment de l'exécution d'un programme et s'appelle le chargeur de liens. Ce dernier recherche des bibliothèques partagées dans un ordre précis :

dans les chemins précisés par la variable système LD_LIBRARY_PATH,

dans les chemins précisés dans le contenu compilé du fichier /etc/ld.so.cache,

dans /lib et /usr/lib.

Il est à noter que le contenu du cache ld.so.cache est construit à partir des informations contenus dans le fichier de configuration /etc/ld.so.conf.

Afin d'étudier les bibliothèques liées à une application, nous allons d'abord installer l'application mc :

[root@centos7 ~]# yum install mc
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: fr2.rpmfind.net
* extras: mirror.ibcp.fr
* updates: mirror.ibcp.fr
Resolving Dependencies
--> Running transaction check
---> Package mc.x86_64 1:4.8.7-8.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
======================================================================================================================================================
Package Arch Version Repository Size
======================================================================================================================================================
Installing:
mc x86_64 1:4.8.7-8.el7 base 1.7 M
Transaction Summary
======================================================================================================================================================
Install 1 Package
Total download size: 1.7 M
Installed size: 5.6 M
Is this ok [y/d/N]: y

La Commande ldd

Pour déterminer quelles sont les bibliothèques liées à une application, il convient d'utiliser la commande ldd :

[root@centos7 ~]# ldd /usr/bin/mc
linux-vdso.so.1 => (0x00007fff0fdfe000)
libslang.so.2 => /lib64/libslang.so.2 (0x00007f8896ae0000)
libgpm.so.2 => /lib64/libgpm.so.2 (0x00007f88968d9000)
libssh2.so.1 => /lib64/libssh2.so.1 (0x00007f88966ae000)
libgmodule-2.0.so.0 => /lib64/libgmodule-2.0.so.0 (0x00007f88964aa000)
libglib-2.0.so.0 => /lib64/libglib-2.0.so.0 (0x00007f8896181000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f8895f64000)
libc.so.6 => /lib64/libc.so.6 (0x00007f8895ba3000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f889599f000)
libm.so.6 => /lib64/libm.so.6 (0x00007f889569c000)
libncurses.so.5 => /lib64/libncurses.so.5 (0x00007f8895475000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f889524b000)
libssl.so.10 => /lib64/libssl.so.10 (0x00007f8894fde000)
libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007f8894bf9000)
libz.so.1 => /lib64/libz.so.1 (0x00007f88949e3000)
/lib64/ld-linux-x86-64.so.2 (0x00007f8896e6b000)
libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007f8894798000)
libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007f88944b8000)
libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007f88942b4000)
libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007f889407e000)
libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007f8893e70000)
libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f8893c6c000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f8893a51000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f889382c000)
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f88935ca000)
liblzma.so.5 => /lib64/liblzma.so.5 (0x00007f88933a5000)

Afin de comprendre ce qui se passe dans le cas où une bibliothèque est manquante, renommez la bibliothèque /usr/lib/libslang.so.2 en /usr/lib/libslang.so.2.old :

[root@centos7 ~]# mv /lib64/libslang.so.2 /lib64/libslang.so.2.old

Exécutez de nouveau la commande ldd. Vous obtiendrez un résultat similaire à celui-ci :

[root@centos7 ~]# ldd /usr/bin/mc
linux-vdso.so.1 => (0x00007fffe31f9000)
libslang.so.2 => not found
libgpm.so.2 => /lib64/libgpm.so.2 (0x00007f7b54e49000)
libssh2.so.1 => /lib64/libssh2.so.1 (0x00007f7b54c1f000)
libgmodule-2.0.so.0 => /lib64/libgmodule-2.0.so.0 (0x00007f7b54a1b000)
libglib-2.0.so.0 => /lib64/libglib-2.0.so.0 (0x00007f7b546f1000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f7b544d5000)
libc.so.6 => /lib64/libc.so.6 (0x00007f7b54114000)
libncurses.so.5 => /lib64/libncurses.so.5 (0x00007f7b53eec000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f7b53cc2000)
libssl.so.10 => /lib64/libssl.so.10 (0x00007f7b53a56000)
libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007f7b53670000)
libz.so.1 => /lib64/libz.so.1 (0x00007f7b5345a000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f7b53256000)
/lib64/ld-linux-x86-64.so.2 (0x00007f7b55064000)
libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007f7b5300b000)
libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007f7b52d2b000)
libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007f7b52b27000)
libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007f7b528f1000)
libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007f7b526e3000)
libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f7b524df000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f7b522c4000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f7b5209f000)
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f7b51e3d000)
liblzma.so.5 => /lib64/liblzma.so.5 (0x00007f7b51c18000)

Notez la présence de la ligne libslang.so.2 ⇒ not found. Compte tenu de la bibliothèque partagée manquante, le programme mc ne peut plus être lancé :

[root@centos7 ~]# mc
mc: error while loading shared libraries: libslang.so.2: cannot open shared object file: No such file or directory

Renommez la bibliothèque correctement et vérifiez la résolution de l'erreur précédente avec la commande ldd :

[root@centos7 ~]# mv /lib64/libslang.so.2.old /lib64/libslang.so.2
[root@centos7 ~]# ldd /usr/bin/mc
linux-vdso.so.1 => (0x00007fff541fe000)
libslang.so.2 => /lib64/libslang.so.2 (0x00007fcb40b0a000)
libgpm.so.2 => /lib64/libgpm.so.2 (0x00007fcb40903000)
libssh2.so.1 => /lib64/libssh2.so.1 (0x00007fcb406d8000)
libgmodule-2.0.so.0 => /lib64/libgmodule-2.0.so.0 (0x00007fcb404d4000)
libglib-2.0.so.0 => /lib64/libglib-2.0.so.0 (0x00007fcb401ab000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fcb3ff8e000)
libc.so.6 => /lib64/libc.so.6 (0x00007fcb3fbcd000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fcb3f9c9000)
libm.so.6 => /lib64/libm.so.6 (0x00007fcb3f6c6000)
libncurses.so.5 => /lib64/libncurses.so.5 (0x00007fcb3f49f000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007fcb3f275000)
libssl.so.10 => /lib64/libssl.so.10 (0x00007fcb3f008000)
libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007fcb3ec23000)
libz.so.1 => /lib64/libz.so.1 (0x00007fcb3ea0d000)
/lib64/ld-linux-x86-64.so.2 (0x00007fcb40e95000)
libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007fcb3e7c2000)
libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007fcb3e4e2000)
libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007fcb3e2de000)
libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007fcb3e0a8000)
libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007fcb3de9a000)
libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007fcb3dc96000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007fcb3da7b000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fcb3d856000)
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fcb3d5f4000)
liblzma.so.5 => /lib64/liblzma.so.5 (0x00007fcb3d3cf000)

Le fichier /etc/ld.so.conf

Le fichier /etc/ld.so.conf est utilisé pour configurer le cache /etc/ld.so.cache :

[root@centos7 ~]# cat /etc/ld.so.conf
include ld.so.conf.d/*.conf

Dans ce cas, le fichier ne contient qu'une directive include qui renvoie vers le contenu du répertoire /etc/ld.so.conf.d/ :

[root@centos7 ~]# ls -l /etc/ld.so.conf.d/
total 20
-rw-r--r--. 1 root root 19 Jun 9 2014 dyninst-x86_64.conf
-r--r--r--. 1 root root 63 Jun 30 2014 kernel-3.10.0-123.el7.x86_64.conf
-rw-r--r--. 1 root root 17 Jun 10 2014 libiscsi-x86_64.conf
-rw-r--r--. 1 root root 17 Jun 10 2014 mariadb-x86_64.conf
-rw-r--r--. 1 root root 24 Jun 9 2014 tracker-x86_64.conf

Par exemple, le contenu du fichier mariadb-x86_64.conf est :

[root@centos7 ~]# cat /etc/ld.so.conf.d/mariadb-x86_64.conf
/usr/lib64/mysql

La Commande ldconfig

La commande ldconfig est utilisée pour :

mettre à jour le cache pour les chemins inclus dans le fichier /etc/ld.so.conf ainsi que pour les répertoires /lib et /usr/lib. L'option -N de la commande ldconfig empêche la mise à jour des chemins dans le fichier,

mettre à jour les liens symboliques sur les bibliothèques. L'option -X de la commande ldconfig empêche la mise à jour des liens symboliques.

Les liens symboliques sont utilisés pour gérer les versions de bibliothèques.

La commande ldconfig peut être utilisée avec l'option -p pour visualiser le contenu du cache :

[root@centos7 ~]# ldconfig -p | more
889 libs found in cache `/etc/ld.so.cache'
p11-kit-trust.so (libc6,x86-64) => /lib64/p11-kit-trust.so
libzapojit-0.0.so.0 (libc6,x86-64) => /lib64/libzapojit-0.0.so.0
libz.so.1 (libc6,x86-64) => /lib64/libz.so.1
libyelp.so.0 (libc6,x86-64) => /lib64/libyelp.so.0
libyajl.so.2 (libc6,x86-64) => /lib64/libyajl.so.2
libxtables.so.10 (libc6,x86-64) => /lib64/libxtables.so.10
libxslt.so.1 (libc6,x86-64) => /lib64/libxslt.so.1
libxml2.so.2 (libc6,x86-64) => /lib64/libxml2.so.2
libxmlrpc_util.so.3 (libc6,x86-64) => /lib64/libxmlrpc_util.so.3
libxmlrpc_server_cgi.so.3 (libc6,x86-64) => /lib64/libxmlrpc_server_cgi.so.3
libxmlrpc_server_abyss.so.3 (libc6,x86-64) => /lib64/libxmlrpc_server_abyss.so.3
libxmlrpc_server.so.3 (libc6,x86-64) => /lib64/libxmlrpc_server.so.3
libxmlrpc_client.so.3 (libc6,x86-64) => /lib64/libxmlrpc_client.so.3
libxmlrpc_abyss.so.3 (libc6,x86-64) => /lib64/libxmlrpc_abyss.so.3
libxmlrpc.so.3 (libc6,x86-64) => /lib64/libxmlrpc.so.3
libxklavier.so.16 (libc6,x86-64) => /lib64/libxklavier.so.16
libxkbfile.so.1 (libc6,x86-64) => /lib64/libxkbfile.so.1
libxcb.so.1 (libc6,x86-64) => /lib64/libxcb.so.1
libxcb-xvmc.so.0 (libc6,x86-64) => /lib64/libxcb-xvmc.so.0
libxcb-xv.so.0 (libc6,x86-64) => /lib64/libxcb-xv.so.0
libxcb-xtest.so.0 (libc6,x86-64) => /lib64/libxcb-xtest.so.0
libxcb-xselinux.so.0 (libc6,x86-64) => /lib64/libxcb-xselinux.so.0
libxcb-xkb.so.0 (libc6,x86-64) => /lib64/libxcb-xkb.so.0
libxcb-xinerama.so.0 (libc6,x86-64) => /lib64/libxcb-xinerama.so.0
libxcb-xf86dri.so.0 (libc6,x86-64) => /lib64/libxcb-xf86dri.so.0
libxcb-xfixes.so.0 (libc6,x86-64) => /lib64/libxcb-xfixes.so.0
libxcb-xevie.so.0 (libc6,x86-64) => /lib64/libxcb-xevie.so.0
--More--

Pour ajouter des bibliothèques partagées, il convient de :

créer un fichier dans le répertoire /etc/ld.so.conf.d/ et d'y inscrire le ou les chemins vers le lieu de stockage des bibliothèques partagées à ajouter,

exécuter la commande ldconfig -v, où v implique verbose, afin de reconstruire le cache.

<html>

Copyright © 2004-2016 Hugh Norris.<br><br> <a rel=“license” href=“http://creativecommons.org/licenses/by-nc-nd/3.0/fr/”><img alt=“Licence Creative Commons” style=“border-width:0” src=“http://i.creativecommons.org/l/by-nc-nd/3.0/fr/88x31.png” /></a><br />Ce(tte) oeuvre est mise à disposition selon les termes de la <a rel=“license” href=“http://creativecommons.org/licenses/by-nc-nd/3.0/fr/”>Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Pas de Modification 3.0 France</a>.

</html>