Dernière mise-à-jour : 2020/01/30 03:27
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.
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.
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 :
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
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 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 est utilisée pour :
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 :
<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>