Comprendre les bibliothèques partagées dans Linux

Comprendre les bibliothèques partagées dans Linux

En programmation, une bibliothèque est un assortiment de codes pré-compilés qui peuvent être réutilisés dans un programme. Les bibliothèques simplifient la vie des programmeurs, en ce qu'ils fournissent des fonctions, des routines, des classes, des structures de données réutilisables, etc. (écrite 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 à créer une nouvelle fonction mathématique pour cela, vous pouvez simplement utiliser les fonctions existantes dans les bibliothèques pour ce langage de programmation.

Des exemples de bibliothèques de Linux incluent libc (la bibliothèque C standard) ou Glibc (Version GNU de la bibliothèque standard C), libcurl (bibliothèque de transfert de fichiers multiprotocol), libcrypt (bibliothèque utilisée pour le chiffrement, le hachage et le codage en c), et bien d'autres.

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

  • Bibliothèques statiques - sont liés à un programme statiquement au moment de la compilation.
  • Bibliothèques dynamiques ou partagées - sont chargés lorsqu'un programme est lancé et chargé en mémoire et que 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 n'est 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 (A.k.un sonme) et un «nom de fichier» (chemin absolu vers le fichier qui stocke le code de bibliothèque).

Par exemple, le sonme pour libc est libc.donc.6: où lib est le préfixe, c est un nom descriptif, donc signifie objet partagé, et 6 est la version. Et son nom de fichier est: / lib64 / libc.donc.6. Notez que le Soname est en fait un lien symbolique avec le nom de fichier.

Localisation des bibliothèques partagées dans Linux

Les bibliothèques partagées sont chargées par LD.donc (ou LD.donc.X) et LD-LINUX.donc (ou LD-LINUX.donc.X) Programmes, où X est la version. En linux, / lib / ld-linux.donc.X recherche et charge toutes les bibliothèques partagées utilisées par un programme.

Un programme peut appeler une bibliothèque à l'aide de son nom de bibliothèque ou de 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 sont situées dans / usr / local / lib, / usr / local / lib64, / usr / lib et / usr / lib64; Les bibliothèques de startup système sont dans / lib et / lib64. Les programmeurs peuvent cependant installer des bibliothèques dans des emplacements personnalisés.

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

# vi / etc / ld.donc.confli 

La (s) ligne (s) de ce fichier demande au noyau de charger le fichier dans / etc / ld.donc.confli.d. De cette façon, les mainteneurs ou les programmeurs de packages peuvent ajouter leurs répertoires de bibliothèque personnalisés à la liste de recherche.

Si vous regardez dans le / etc / ld.donc.confli.d Répertoire, vous verrez .confli Fichiers pour certains packages communs (Kernel, MySQL et PostgreSQL dans ce cas):

# ls / etc / ld.donc.confli.d noyau-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.confli 

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

# chat mariadb-x86_64.confli / usr / lib64 / mysql 

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

# Exporter ld_library_path = / path / vers / bibliothèque / fichier 

Gérer les bibliothèques partagées dans Linux

Laissez maintenant voir comment gérer les bibliothèques partagées. Pour obtenir une liste de toutes les dépendances de bibliothèque partagées pour un fichier binaire, vous pouvez utiliser le Utilitaire LDD. La sortie de LDD est sous la forme:

Nom de la bibliothèque => Nom de fichier (une valeur hexadécimale) ou nom de fichier (une valeur hexadécimale) #C'est montré lorsque le nom de la bibliothèque ne peut pas être lu 

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

# LDD / USR / BIN / LS ou # LDD / BIN / LS 
Échantillon de sortie
 linux-vdso.donc.1 => (0x00007FEBF9C2000) LIBSLELINUX.donc.1 => / lib64 / libselinux.donc.1 (0x0000003b71e00000) Librt.donc.1 => / lib64 / bibliothèque.donc.1 (0x0000003b71600000) libcap.donc.2 => / lib64 / libcap.donc.2 (0x0000003b76a00000) libacl.donc.1 => / lib64 / libacl.donc.1 (0x0000003B75E00000) LIBC.donc.6 => / lib64 / libc.donc.6 (0x0000003b70600000) libdl.donc.2 => / lib64 / libdl.donc.2 (0x0000003b70a00000) / lib64 / ld-linux-x86-64.donc.2 (0x0000561abfc09000) libpthread.donc.0 => / lib64 / libpthread.donc.0 (0x0000003b70e00000) libattr.donc.1 => / lib64 / libattr.donc.1 (0x0000003b75600000) 

Parce que les bibliothèques partagées peuvent exister dans de nombreux répertoires différents, la recherche dans tous ces répertoires lorsqu'un programme est lancé serait grandement inefficace: ce qui est l'un des inconvénients probables des bibliothèques dynamiques. Par conséquent, un mécanisme de mise en cache est utilisé, effectué par le programme ldconfig.

Par défaut, ldconfig lit le contenu de / etc / ld.donc.confli, crée les liens symboliques appropriés dans les répertoires de liens dynamiques, puis écrit un cache à / etc / ld.donc.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 ou de créer votre propre, ou de créer de nouveaux répertoires de bibliothèque. Vous devez exécuter le ldconfig commande pour effectuer les modifications.

# ldconfig ou # ldconfig -v #shows fichiers et répertoires avec lesquels il fonctionne avec 

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

Alternativement, exécutez la commande suivante pour créer des liens symboliques à partir du sonme au nom de fichier:

# ldconfig -n / path / to / votre / partage / bibliothèques 

Pour commencer par la création de vos propres bibliothèques, consultez ce guide à partir du projet de documentation Linux (TLDP).

C'est tout pour le moment! Dans cet article, nous vous avons donné une introduction aux bibliothèques et expliqué les bibliothèques partagées, et comment les gérer dans Linux. Si vous avez des questions ou des idées supplémentaires à partager, utilisez le formulaire de commentaire ci-dessous.