Table des matières
Dernière mise-à-jour : 2020/01/30 03:27
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>