Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
elearning:workbooks:redhat:rh124:l106 [2024/09/30 12:08] adminelearning:workbooks:redhat:rh124:l106 [2024/10/24 10:48] (Version actuelle) admin
Ligne 25: Ligne 25:
       * 2.9 - L'historique dnf       * 2.9 - L'historique dnf
       * 2.10 - Le Dépôt Application Stream       * 2.10 - Le Dépôt Application Stream
 +    * LAB #3 - Les Bibliothèques Partagées
 +      * 3.1 - Présentation
 +        * Introduction
 +        * Stockage
 +        * ld-linux.so.2
 +      * 3.2 - La Commande ldd
 +      * 3.3 - Le fichier /etc/ld.so.conf
 +      * 3.4 - La Commande ldconfig
  
 =====LAB #1 - La commande rpm===== =====LAB #1 - La commande rpm=====
Ligne 2388: Ligne 2396:
 Last metadata expiration check: 0:59:14 ago on Mon 30 Sep 2024 12:48:56 PM CEST. Last metadata expiration check: 0:59:14 ago on Mon 30 Sep 2024 12:48:56 PM CEST.
 </code> </code>
 +
 +=====LAB #3 - Les Bibliothèques Partagées=====
 +
 +====3.1 - 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 |
 +
 +<WRAP center round important>
 +**Important** : La bibliothèque la plus importante est **libc**. Sans elle, le système Linux ne peut pas fonctionner.
 +</WRAP>
 +
 +===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** :
 +
 +<code>
 +[root@redhat9 ~]# dnf install mc -y
 +</code>
 +
 +====3.2 - La Commande ldd====
 +
 +Pour déterminer quelles sont les bibliothèques liées à une application, il convient d'utiliser la commande **ldd** :
 +
 +<code>
 +[root@redhat9 ~]# ldd /usr/bin/mc
 +        linux-vdso.so.1 (0x00007ffe40b83000)
 +        libslang.so.2 => /lib64/libslang.so.2 (0x00007f0579a00000)
 +        libgpm.so.2 => /lib64/libgpm.so.2 (0x00007f0579e2d000)
 +        libe2p.so.2 => /lib64/libe2p.so.2 (0x00007f0579e21000)
 +        libglib-2.0.so.0 => /lib64/libglib-2.0.so.0 (0x00007f0579ce6000)
 +        libc.so.6 => /lib64/libc.so.6 (0x00007f0579600000)
 +        libm.so.6 => /lib64/libm.so.6 (0x00007f0579925000)
 +        libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f05798ad000)
 +        /lib64/ld-linux-x86-64.so.2 (0x00007f0579f99000)
 +</code>
 +
 +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** :
 +
 +<code>
 +[root@redhat9 ~]# mv /lib64/libslang.so.2 /lib64/libslang.so.2.old
 +</code>
 +
 +Exécutez de nouveau la commande ldd. Vous obtiendrez un résultat similaire à celui-ci :
 +
 +<code>
 +[root@redhat9 ~]# ldd /usr/bin/mc
 +        linux-vdso.so.1 (0x00007ffe893a6000)
 +        libslang.so.2 => not found
 +        libgpm.so.2 => /lib64/libgpm.so.2 (0x00007fdff3ea8000)
 +        libe2p.so.2 => /lib64/libe2p.so.2 (0x00007fdff3e9c000)
 +        libglib-2.0.so.0 => /lib64/libglib-2.0.so.0 (0x00007fdff3d61000)
 +        libc.so.6 => /lib64/libc.so.6 (0x00007fdff3a00000)
 +        libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fdff3ce9000)
 +        /lib64/ld-linux-x86-64.so.2 (0x00007fdff4014000)
 +</code>
 +
 +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é :
 +
 +<code>
 +[root@redhat9 ~]# mc
 +/usr/bin/mc: error while loading shared libraries: libslang.so.2: cannot open shared object file: No such file or directory
 +</code>
 +
 +Renommez la bibliothèque correctement et vérifiez la résolution de l'erreur précédente avec la commande ldd :
 +
 +<code>
 +[root@redhat9 ~]# mv /lib64/libslang.so.2.old /lib64/libslang.so.2
 +
 +[root@redhat9 ~]# ldd /usr/bin/mc
 +        linux-vdso.so.1 (0x00007ffff85f9000)
 +        libslang.so.2 => /lib64/libslang.so.2 (0x00007effc9e00000)
 +        libgpm.so.2 => /lib64/libgpm.so.2 (0x00007effca1d4000)
 +        libe2p.so.2 => /lib64/libe2p.so.2 (0x00007effca1c8000)
 +        libglib-2.0.so.0 => /lib64/libglib-2.0.so.0 (0x00007effc9cc5000)
 +        libc.so.6 => /lib64/libc.so.6 (0x00007effc9a00000)
 +        libm.so.6 => /lib64/libm.so.6 (0x00007effca0ed000)
 +        libpcre.so.1 => /lib64/libpcre.so.1 (0x00007effc9c4d000)
 +        /lib64/ld-linux-x86-64.so.2 (0x00007effca340000)
 +</code>
 +
 +====3.3 - Le fichier /etc/ld.so.conf====
 +
 +Le fichier **/etc/ld.so.conf** est utilisé pour configurer le cache **/etc/ld.so.cache** :
 +
 +<code>
 +[root@redhat9 ~]# cat /etc/ld.so.conf
 +include ld.so.conf.d/*.conf
 +</code>
 +
 +Dans ce cas, le fichier ne contient qu'une directive **include** qui renvoie vers le contenu du répertoire **/etc/ld.so.conf.d/** :
 +
 +<code>
 +[root@redhat9 ~]# ls -l /etc/ld.so.conf.d/
 +total 4
 +-rw-r--r--. 1 root root 30 Jan 19  2024 pipewire-jack-x86_64.conf
 +</code>
 +
 +Par exemple, le contenu du fichier **pipewire-jack-x86_64.conf** est :
 +
 +<code>
 +[root@redhat9 ~]# cat /etc/ld.so.conf.d/pipewire-jack-x86_64.conf
 +/usr/lib64/pipewire-0.3/jack/
 +</code>
 +
 +====3.4 - 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 :
 +
 +<code>
 +[root@redhat9 ~]# ldconfig -p | more
 +827 libs found in cache `/etc/ld.so.cache'
 +        libzstd.so.1 (libc6,x86-64) => /lib64/libzstd.so.1
 +        libz.so.1 (libc6,x86-64) => /lib64/libz.so.1
 +        libyelp.so.0 (libc6,x86-64) => /lib64/libyelp.so.0
 +        libyaml-0.so.2 (libc6,x86-64) => /lib64/libyaml-0.so.2
 +        libyajl.so.2 (libc6,x86-64) => /lib64/libyajl.so.2
 +        libxtables.so.12 (libc6,x86-64) => /lib64/libxtables.so.12
 +        libxslt.so.1 (libc6,x86-64) => /lib64/libxslt.so.1
 +        libxshmfence.so.1 (libc6,x86-64) => /lib64/libxshmfence.so.1
 +        libxml2.so.2 (libc6,x86-64) => /lib64/libxml2.so.2
 +        libxmlsec1.so.1 (libc6,x86-64) => /lib64/libxmlsec1.so.1
 +        libxmlsec1-openssl.so.1 (libc6,x86-64) => /lib64/libxmlsec1-openssl.so.1
 +        libxmlsec1-openssl.so (libc6,x86-64) => /lib64/libxmlsec1-openssl.so
 +        libxmlb.so.2 (libc6,x86-64) => /lib64/libxmlb.so.2
 +        libxklavier.so.16 (libc6,x86-64) => /lib64/libxklavier.so.16
 +        libxkbregistry.so.0 (libc6,x86-64) => /lib64/libxkbregistry.so.0
 +        libxkbfile.so.1 (libc6,x86-64) => /lib64/libxkbfile.so.1
 +        libxkbcommon.so.0 (libc6,x86-64) => /lib64/libxkbcommon.so.0
 +        libxkbcommon-x11.so.0 (libc6,x86-64) => /lib64/libxkbcommon-x11.so.0
 +        libxcvt.so.0 (libc6,x86-64) => /lib64/libxcvt.so.0
 +        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.1 (libc6,x86-64) => /lib64/libxcb-xkb.so.1
 +        libxcb-xinput.so.0 (libc6,x86-64) => /lib64/libxcb-xinput.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-util.so.1 (libc6,x86-64) => /lib64/libxcb-util.so.1
 +        libxcb-sync.so.1 (libc6,x86-64) => /lib64/libxcb-sync.so.1
 +        libxcb-shm.so.0 (libc6,x86-64) => /lib64/libxcb-shm.so.0
 +        libxcb-shape.so.0 (libc6,x86-64) => /lib64/libxcb-shape.so.0
 +        libxcb-screensaver.so.0 (libc6,x86-64) => /lib64/libxcb-screensaver.so.0
 +        libxcb-res.so.0 (libc6,x86-64) => /lib64/libxcb-res.so.0
 +        libxcb-render.so.0 (libc6,x86-64) => /lib64/libxcb-render.so.0
 +        libxcb-record.so.0 (libc6,x86-64) => /lib64/libxcb-record.so.0
 +        libxcb-randr.so.0 (libc6,x86-64) => /lib64/libxcb-randr.so.0
 +        libxcb-present.so.0 (libc6,x86-64) => /lib64/libxcb-present.so.0
 +        libxcb-glx.so.0 (libc6,x86-64) => /lib64/libxcb-glx.so.0
 +        libxcb-dri3.so.0 (libc6,x86-64) => /lib64/libxcb-dri3.so.0
 +        libxcb-dri2.so.0 (libc6,x86-64) => /lib64/libxcb-dri2.so.0
 +        libxcb-dpms.so.0 (libc6,x86-64) => /lib64/libxcb-dpms.so.0
 +        libxcb-damage.so.0 (libc6,x86-64) => /lib64/libxcb-damage.so.0
 +        libxcb-composite.so.0 (libc6,x86-64) => /lib64/libxcb-composite.so.0
 +        libxatracker.so.2 (libc6,x86-64) => /lib64/libxatracker.so.2
 +        libwpe-1.0.so.1 (libc6,x86-64) => /lib64/libwpe-1.0.so.1
 +        libwoff2enc.so.1.0.2 (libc6,x86-64) => /lib64/libwoff2enc.so.1.0.2
 +        libwoff2dec.so.1.0.2 (libc6,x86-64) => /lib64/libwoff2dec.so.1.0.2
 +        libwoff2common.so.1.0.2 (libc6,x86-64) => /lib64/libwoff2common.so.1.0.2
 +        libwnck-3.so.0 (libc6,x86-64) => /lib64/libwnck-3.so.0
 +        libwireplumber-0.4.so.0 (libc6,x86-64) => /lib64/libwireplumber-0.4.so.0
 +        libwebrtc_audio_processing.so.1 (libc6,x86-64) => /lib64/libwebrtc_audio_processing.so.1
 +        libwebpmux.so.3 (libc6,x86-64) => /lib64/libwebpmux.so.3
 +--More--
 +</code>
 +
 +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.
  
 ----- -----
 Copyright © 2024 Hugh Norris. Copyright © 2024 Hugh Norris.
Menu