Recherche de site Web

Comprendre les bibliothèques partagées sous Linux


En programmation, une bibliothèque est un assortiment de morceaux de code précompilés qui peuvent être réutilisés dans un programme. Les bibliothèques simplifient la vie des programmeurs, dans la mesure où elles fournissent des fonctions, routines, classes, structures de données réutilisables, etc. (écrites par un autre programmeur), qu'ils peuvent utiliser dans leurs programmes.

Par exemple, si vous créez une application qui doit effectuer des opérations mathématiques, vous n'avez pas besoin de créer une nouvelle fonction mathématique pour cela, vous pouvez simplement utiliser les fonctions existantes dans les bibliothèques de ce langage de programmation.

Des exemples de bibliothèques sous Linux incluent libc (la bibliothèque C standard) ou Glibc (version GNU de la bibliothèque C standard), libcurl (fichier multiprotocole bibliothèque de transfert), libcrypt (bibliothèque utilisée pour le chiffrement, le hachage et l'encodage en C), et bien d'autres.

Linux prend en charge deux classes de bibliothèques, à savoir :

  • Bibliothèques statiques – sont liées statiquement à un programme au moment de la compilation.
  • Bibliothèques dynamiques ou partagées : elles sont chargées lorsqu'un programme est lancé et chargé en mémoire et la liaison se produit au moment de l'exécution.

Les bibliothèques dynamiques ou partagées peuvent en outre être classées en :

  • Bibliothèques liées dynamiquement – ici, un programme est lié à la bibliothèque partagée et le noyau charge la bibliothèque (au cas où elle ne serait pas en mémoire) lors de l'exécution.
  • Bibliothèques chargées dynamiquement – le programme prend le contrôle total en appelant des fonctions avec la bibliothèque.

Conventions de dénomination des bibliothèques partagées

Les bibliothèques partagées sont nommées de deux manières : le nom de la bibliothèque (alias soname) et un « nom de fichier » (chemin absolu vers le fichier qui stocke le code de la bibliothèque).

Par exemple, le soname de libc est libc.so.6 : où lib est le préfixe, c est un nom descriptif, signifiant donc objet partagé, et 6 est la version. Et son nom de fichier est : /lib64/libc.so.6. Notez que le soname est en fait un lien symbolique vers le nom du fichier.

Localisation des bibliothèques partagées sous Linux

Les bibliothèques partagées sont chargées par ld.so (ou ld.so.x) et ld-linux.so (ou ld- linux.so.x), où x est la version. Sous Linux, /lib/ld-linux.so.x recherche et charge toutes les bibliothèques partagées utilisées par un programme.

Un programme peut appeler une bibliothèque en utilisant son nom de bibliothèque ou son nom de fichier, et un chemin de bibliothèque stocke les répertoires où les bibliothèques peuvent être trouvées dans le système de fichiers. Par défaut, les bibliothèques se trouvent dans /usr/local/lib, /usr/local/lib64, /usr/lib et /usr/lib64; Les bibliothèques de démarrage du système se trouvent dans /lib et /lib64. Les programmeurs peuvent toutefois installer des bibliothèques dans des emplacements personnalisés.

Le chemin de la bibliothèque peut être défini dans le fichier /etc/ld.so.conf que vous pouvez modifier avec un éditeur de ligne de commande.

vi /etc/ld.so.conf 

La ou les lignes de ce fichier demandent au noyau de charger le fichier dans /etc/ld.so.conf.d. De cette façon, les responsables de packages ou les programmeurs peuvent ajouter leurs répertoires de bibliothèques personnalisés à la liste de recherche.

Si vous regardez dans le répertoire /etc/ld.so.conf.d, vous verrez les fichiers .conf pour certains packages courants (kernel, mysql et postgresql dans ce cas):

ls /etc/ld.so.conf.d

kernel-2.6.32-358.18.1.el6.x86_64.conf  kernel-2.6.32-696.1.1.el6.x86_64.conf  mariadb-x86_64.conf
kernel-2.6.32-642.6.2.el6.x86_64.conf   kernel-2.6.32-696.6.3.el6.x86_64.conf  postgresql-pgdg-libs.conf

Si vous jetez un œil au fichier mariadb-x86_64.conf, vous verrez un chemin absolu vers les bibliothèques de packages.

cat mariadb-x86_64.conf

/usr/lib64/mysql

La méthode ci-dessus définit le chemin de la bibliothèque de manière permanente. Pour le définir temporairement, utilisez la variable d'environnement LD_LIBRARY_PATH sur la ligne de commande. Si vous souhaitez conserver les modifications permanentes, ajoutez cette ligne dans le fichier d'initialisation du shell /etc/profile (global) ou ~/.profile (spécifique à l'utilisateur).

export LD_LIBRARY_PATH=/path/to/library/file

Gestion des bibliothèques partagées sous Linux

Voyons maintenant comment gérer les bibliothèques partagées. Pour obtenir une liste de toutes les dépendances de bibliothèque partagée pour un fichier binaire, vous pouvez utiliser l'utilitaire ldd. Le résultat de ldd se présente sous la forme :

library name =>  filename (some hexadecimal value)
OR
filename (some hexadecimal value)  #this is shown when library name can’t be read

Cette commande affiche toutes les dépendances de la bibliothèque partagée pour la commande ls.

ldd /usr/bin/ls
OR
ldd /bin/ls
Exemple de sortie
	linux-vdso.so.1 =>  (0x00007ffebf9c2000)
	libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003b71e00000)
	librt.so.1 => /lib64/librt.so.1 (0x0000003b71600000)
	libcap.so.2 => /lib64/libcap.so.2 (0x0000003b76a00000)
	libacl.so.1 => /lib64/libacl.so.1 (0x0000003b75e00000)
	libc.so.6 => /lib64/libc.so.6 (0x0000003b70600000)
	libdl.so.2 => /lib64/libdl.so.2 (0x0000003b70a00000)
	/lib64/ld-linux-x86-64.so.2 (0x0000561abfc09000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003b70e00000)
	libattr.so.1 => /lib64/libattr.so.1 (0x0000003b75600000)

Étant donné que les bibliothèques partagées peuvent exister dans de nombreux répertoires différents, la recherche dans tous ces répertoires au lancement d'un programme serait très inefficace : ce qui est l'un des inconvénients probables des bibliothèques dynamiques. Un mécanisme de mise en cache est donc utilisé, exécuté par le programme ldconfig.

Par défaut, ldconfig lit le contenu de /etc/ld.so.conf, crée les liens symboliques appropriés dans les répertoires de liens dynamiques, puis écrit un cache dans /etc/ld.so.cache qui est ensuite facilement utilisé par d'autres programmes.

Ceci est très important, surtout lorsque vous venez d'installer de nouvelles bibliothèques partagées, de créer les vôtres ou de créer de nouveaux répertoires de bibliothèques. Vous devez exécuter la commande ldconfig pour appliquer les modifications.

ldconfig
OR
ldconfig -v 	#shows files and directories it works with

Après avoir créé votre bibliothèque partagée, vous devez l'installer. Vous pouvez soit le déplacer vers l'un des répertoires standard mentionnés ci-dessus et exécuter la commande ldconfig.

Vous pouvez également exécuter la commande suivante pour créer des liens symboliques du soname vers le nom de fichier :

ldconfig -n /path/to/your/shared/libraries

Pour commencer à créer vos propres bibliothèques, consultez ce guide du Linux Documentation Project (TLDP).

C'est tout pour le moment! Dans cet article, nous vous avons présenté les bibliothèques et expliqué les bibliothèques partagées, ainsi que comment les gérer sous Linux. Si vous avez des questions ou des idées supplémentaires à partager, utilisez le formulaire de commentaires ci-dessous.