projets:systemesreseaux:sharedlibraries
no way to compare when less than two revisions
Différences
Ci-dessous, les différences entre deux révisions de la page.
— | projets:systemesreseaux:sharedlibraries [2024/04/16 22:26] (Version actuelle) – créée - modification externe 127.0.0.1 | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | ====== Gestion des bibliothèques partagées ====== | ||
+ | |||
+ | ===== Introduction ===== | ||
+ | Lors du développement d'un logiciel (libre), il est souvent inutile de réinventer | ||
+ | la roue lorsqu' | ||
+ | pour utiliser les méthodes d' | ||
+ | sont souvent regroupés par affinité (méthodes systèmes, gestion du chiffrement, | ||
+ | algorithmes mathématiques ...) sous forme de bibliothèques que d' | ||
+ | |||
+ | Le développeur d'une application peut choisir au moment de la création | ||
+ | de l' | ||
+ | de plusieurs façons: | ||
+ | * statiquement: | ||
+ | {{: | ||
+ | avantage: tout est inclu, | ||
+ | inconvénient: | ||
+ | |||
+ | * dynamiquement: | ||
+ | {{: | ||
+ | avantage: les ressources disque et mémoire sont optimisées, | ||
+ | inconvénient: | ||
+ | |||
+ | Pour en savoir plus, vous pouvez consulter l' | ||
+ | |||
+ | ===== Outils ===== | ||
+ | |||
+ | En tant qu' | ||
+ | |||
+ | * connaître quelles sont les bibliothèques partagées utilisées par un programme | ||
+ | * trouver, gérer et charger les bibliothèques partagées du système | ||
+ | |||
+ | ==== Connaître les bibliothèques partagées utilisées par un programme ==== | ||
+ | |||
+ | La commande utilisée est (sous Ubuntu 12.04) : | ||
+ | |||
+ | / | ||
+ | |||
+ | qui est un script shell qui pointe vers un exécutable: | ||
+ | |||
+ | / | ||
+ | / | ||
+ | |||
+ | Cet exécutable charge le programme et trouve les références des bibliothèques partagées dont il a besoin. | ||
+ | Exemple: | ||
+ | user@host: | ||
+ | linux-gate.so.1 => (0xb7744000) | ||
+ | libselinux.so.1 => / | ||
+ | librt.so.1 => / | ||
+ | libacl.so.1 => / | ||
+ | libc.so.6 => / | ||
+ | libdl.so.2 => / | ||
+ | / | ||
+ | libpthread.so.0 => / | ||
+ | libattr.so.1 => / | ||
+ | |||
+ | et on s' | ||
+ | |||
+ | En cas de problème, le programme //ldd// nous montrera une erreur de dépendance (ou plusieurs) avec le nom de la bibliothèque dynamique qui n'a pas été trouvée. | ||
+ | |||
+ | Plusieurs cas, soit: | ||
+ | * elle n'a pas été installée, il faut donc trouver le paquet dans la distribution qui installera cette bibliothèque dans le système, | ||
+ | * ou elle est installée, mais elle n'est pas reconnu par le système, et nous allons utiliser un deuxième outil pour gérer cela. | ||
+ | |||
+ | ==== Gérer les bibliothèques partagées du système ==== | ||
+ | |||
+ | Ce deuxième outil est (sous Ubuntu 12.04): | ||
+ | |||
+ | / | ||
+ | |||
+ | C'est un script shell qui demande les droits administrateurs pour l' | ||
+ | |||
+ | / | ||
+ | |||
+ | qui a la particularité d' | ||
+ | |||
+ | Cet exécutable pour trouver, gérer les bibliothèques partagées a besoin d'un certain nombre de fichiers de configuration et de variables d' | ||
+ | |||
+ | |||
+ | ===== Configuration ===== | ||
+ | |||
+ | Le programme // | ||
+ | |||
+ | Le fichier de configuration de // | ||
+ | |||
+ | / | ||
+ | |||
+ | Il contient (sous Ubuntu 12.04), le contenu suivant | ||
+ | | ||
+ | include / | ||
+ | | ||
+ | qui en fait, lui demande d' | ||
+ | dans les fichiers qui se trouvent dans le répertoire: | ||
+ | |||
+ | / | ||
+ | |||
+ | Les fichiers de ce répertoire contiennent des chemins de recherche des bibliothèques partagées, exemple: | ||
+ | user@host: | ||
+ | # libc default configuration | ||
+ | / | ||
+ | |||
+ | user@host: | ||
+ | # Multiarch support | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | |||
+ | Les noms des fichiers qui décrivent les bibliothèques partagées ont la particularité d' | ||
+ | |||
+ | lib<nom de la bibliothèque> | ||
+ | |||
+ | Lorsque // | ||
+ | |||
+ | lib<nom de la bibliothèque> | ||
+ | | ||
+ | Il enregistre aussi ces informations dans un cache pour que le chargeur / | ||
+ | |||
+ | / | ||
+ | |||
+ | Il existe aussi une variable d' | ||
+ | |||
+ | LD_LIBRARY_PATH | ||
+ | | ||
+ | Exemple: | ||
+ | |||
+ | export LD_LIBRARY_PATH=/ | ||
+ | |||
+ | |||
+ | Il y a aussi une autre variable qui permet de charger une bibliothèque avant toutes les autres dans le but par exemple de tester une nouvelle version d'une bibliothèque. | ||
+ | La variable s' | ||
+ | |||
+ | LD_PRELOAD | ||
+ | | ||
+ | et contient le chemin et le nom de la bibliothèque, | ||
+ | |||
+ | export LD_PRELOAD = / | ||
+ | |||
+ | Exemple d' | ||
+ | |||
+ | ===== En résumé ===== | ||
+ | |||
+ | Voici un schéma récapitulatif: | ||
+ | |||
+ | {{: | ||
projets/systemesreseaux/sharedlibraries.txt · Dernière modification : 2024/04/16 22:26 de 127.0.0.1