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 :

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 :

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>