Comment travailler avec des dépendances d'objets partagés (bibliothèque) sous Linux

0
249
Dima Polies/Shutterstock.com

Erreur lors du chargement des bibliothèques partagées : l'erreur redoutée que tout utilisateur de Linux rencontrera tôt ou tard. Quelque chose s'est mal passé avec les dépendances d'objets partagés (les bibliothèques) utilisées par l'exécutable. Apprenez à résoudre ces problèmes et plus encore !

Qu'est-ce qu'une dépendance d'objets partagés ?

A L'objet partagé (également appelé bibliothèque) est un binaire (généralement pas directement exécutable) utilisé par plusieurs programmes/applications sur une instance Linux. De telles bibliothèques sont souvent installées au niveau du système d'exploitation et sont partagées (d'où le nom objet partagé ou bibliothèques) pour être utilisées par une ou plusieurs (et même plusieurs) applications directement exécutables.

Par exemple, un programme qui propose la compression de fichiers peut nécessiter la bibliothèque bz2 (bzip2) libbz2.so.1.0 pour le faire. Le terme bibliothèque est plus souvent utilisé dans les cercles Linux et est le jargon préféré des professionnels, bien que objet partagé (et bibliothèque partagée) soient tous deux techniquement corriger. Il est également intéressant de noter que l'extension de nom de fichier .so utilisée dans de nombreuses bibliothèques signifie objet partagé !

Un exécutable peut avoir zéro, une ou plusieurs bibliothèques sur lesquelles il s'appuie. Moins il y a de bibliothèques, plus la compatibilité sera avancée (lors de la mise à niveau de votre système d'exploitation, par exemple). Plus il y a de bibliothèques, plus il y a de chances que tôt ou tard, certaines dépendances de bibliothèque se brisent. C'est aussi pourquoi les fournisseurs d'applications décident parfois de publier des binaires compilés statiquement plutôt que des binaires compilés dynamiquement.

La différence entre les binaires compilés statiquement et dynamiquement est simple mais a des conséquences de grande envergure. Un binaire compilé statiquement a les bibliothèques (disponibles sur le système du développeur au moment de la compilation) compilées dans le binaire/exécutable résultant. Un binaire compilé dynamiquement utilisera les bibliothèques installées, disponibles et partagées sur le système de l'utilisateur.

Comme vous pouvez le voir immédiatement, cela nécessiterait que l'utilisateur installe les dépendances requises, à moins que cela ne soit pris en charge dans le système de gestion des packages et les détails du système d'exploitation ou du fournisseur d'applications. C'est pourquoi l'exécution d'une commande simple comme sudo apt install …some_app… produira souvent un ensemble d'autres éléments connexes (c'est-à-dire les bibliothèques requises) à co-installer en même temps.

Les deux la compilation statique et dynamique ont des avantages et des inconvénients. Par exemple, si vous utilisez la compilation statique et qu'une bibliothèque que vous avez incluse dans votre progiciel (du point de vue d'un fournisseur de logiciels) a maintenant un bogue de sécurité ou une mise à jour critique, cela signifiera probablement que vous devrez -publiez votre progiciel, même si rien n'a changé dans votre code.

Publicité

Mais encore une fois, compter sur l'utilisateur pour installer des bibliothèques, en particulier pour des programmes complexes, ou lorsque l'auto-compilation de logiciels est requise, avec la prise de conscience que les utilisateurs finaux ont souvent du mal avec de telles choses, n'est pas idéal non plus. C'est un domaine complexe, et la question a souvent été discutée.

Pour les besoins de cet article, nous examinerons les bibliothèques partagées en lien avec un programme qui a été compilé dynamiquement, comme c'est souvent le cas avec les programmes/exécutables/outils du système d'exploitation. Avec les programmes compilés statiquement (qui sont moins courants), une erreur comme ‘Erreur lors du chargement des bibliothèques partagées’ est très peu susceptible de s'afficher, car les bibliothèques sont incluses dans l'exécutable à moins que le programme ne soit en partie dynamique et n'inclue qu'un ensemble limité de bibliothèques statiques intégrées.

Erreur lors du chargement des bibliothèques partagées !

Passons en rootpendant un certain temps (à l'aide de sudo su) et explorez le fonctionnement des bibliothèques partagées lorsqu'il s'agit d'un outil tel que /usr/bin/zip qui est inclus ou installable avec les principales distributions Linux.

Ici, nous avons changé les répertoires en /usr/bin et vérifié si le programme zip/binaire/exécutable est présent. Le trouvant présent, nous avons ensuite vérifié la version en l'invoquant avec –version et en ne prenant que les deux premières lignes de la sortie en canalisant la sortie (en utilisant |) pour éviter la longue sortie donnée autrement.

Enfin, nous avons utilisé l'outil ldd (un programme qui imprime les dépendances d'objets partagés) pour voir de quelles bibliothèques l'exécutable a besoin. Comme nous pouvons le voir, le programme nécessite quatre bibliothèques partagées. La liste des bibliothèques requises est généralement au format de la bibliothèque requise, suivie d'un chemin où la bibliothèque nommée a déjà été trouvée.

Publicité

Pour certaines bibliothèques de niveau supérieur ou spéciales au niveau du système d'exploitation (comme linux-vdso.so.1), aucun chemin de ce type n'est affiché. Cependant, tant qu'aucune erreur ne s'affiche pour aucune entrée, vous savez que c'est bien et disponible (ou préférable). En fait, linux-vdso.so.1 est un objet/bibliothèque virtuel partagé spécial injecté dans chaque processus par le noyau Linux, qui n'a pas de fichier physique sur le disque pour le même. Il est là pour rendre les appels système plus efficaces.

Alors, cassons un peu les choses et renommez l'une des bibliothèques requises afin qu'elle ne puisse plus être découverte automatiquement par le binaire :

Comme vous pouvez le voir, ici, nous avons renommé/déplacé le fichier de /lib/x86_64-linux-gnu/libbz2.so.1.0 à /lib/x86_64-linux-gnu/libbz2.so.1.0.NOT_PRESENT. Cela a cassé notre application zip, et lorsque nous essayons de l'exécuter, nous obtenons l'erreur redoutée lors du chargement de l'erreur des bibliothèques partagées. En y regardant d'un peu plus près, le message d'erreur est en fait assez descriptif, cependant :

zip : erreur lors du chargement des bibliothèques partagées : libbz2.so.1.0 : impossible d'ouvrir le fichier objet partagé : aucun fichier ou répertoire de ce type

Un ingénieur informatique chevronné examinera toujours attentivement les journaux et les sorties/informations de programme qui lui sont présentés avant de passer un appel concernant un problème. Cela serait également payant ici, car le fichier requis est clairement indiqué, libbz2.so.1.0, et le problème est également clairement indiqué. Il n'y a pas de tel fichier ou répertoire. En d'autres termes, libbz2.so.1.0 est manquant !

Nous pouvons également vérifier la même chose avec ldd, comme on peut le voir dans l'image ci-dessus. Un libbz2.so.1.0 clair => not found nous aide à savoir ce qui se passe. Une fois que nous comprenons clairement comment les binaires compilés dynamiquement (la plupart des binaires du système d'exploitation sont compilés de cette façon) chargent et nécessitent des bibliothèques, et comment voir s'il en manque (ou en être informé via le message d'erreur), les choses ne #8217;n'ai plus l'air si compliqué.

Publicité

De plus, une fois que nous connaissons le nom de bibliothèque requis, une recherche rapide dans votre moteur de recherche préféré affichera le package supplémentaire à installer (ou réinstaller) pour obtenir le nom de bibliothèque requis. Très souvent, le nom du package peut même être interprété directement à partir du nom de la bibliothèque. Cependant, dans ce cas, le nom de la bibliothèque d'exécution est un peu décalé.

Il existe deux types de bibliothèques—les bibliothèques d'exécution et les bibliothèques de développement. Dans ce cas, le nom du package qui contient la bibliothèque libbz2.so.1.0 est probablement bzip2, et essayer de désinstaller casserait probablement divers autres éléments, comme on peut le voir dans une longue liste de programmes qui seront supprimés si l'on essaie de désinstaller ou purger le package bzip2.

Le deuxième type de bibliothèque est une bibliothèque de développement. Ceux-ci sont souvent nécessaires lorsque vous essayez de compiler des programmes et sont souvent encore plus étroitement liés à leurs noms de fichiers de bibliothèque réels. Par exemple, dans Ubuntu, prenez simplement le nom de la bibliothèque et ajoutez -dev. Par exemple, si nous voulions installer le package de développement lié au package libbz2.so.1.0, nous pourrions envisager d'installer libbz2-dev :

Bien que cette bibliothèque de développement n'est pas directement liée à notre bibliothèque d'exécution libbz2.so.1.0, elle’ Il est utile de connaître la syntaxe de dénomination de la plupart des noms de packages de développement dans Ubuntu (préfixe de lib et suffixe de -dev avec le nom de la bibliothèque entre ceux-ci) chaque fois qu'une certaine bibliothèque de développement est requise (ce qui est le plus souvent nécessaire lors de la compilation de logiciels ).

Supposons également que n'importe quelle bibliothèque soit cassée. Dans ce cas, l'une des solutions rapides les plus simples consiste à purger la commande de la bibliothèque sudo apt purge your_library_name (ce qui purgerait complètement la bibliothèque/le programme transmis), suivi d'une réinstallation à l'aide de la commande sudo apt install your_library_name.

Et lorsque vous rencontrez une situation similaire à celle ci-dessus, où la désinstallation de la bibliothèque d'exécution nécessite la désinstallation/la purge du programme principal, et où une telle purge/suppression fait trop partie du système d'exploitation ou affecterait trop d'autres choses, vous peut utiliser une option de réinstallation à la place :

sudo apt reinstall bzip2

Ce n'est pas toujours le cas c'est facile, cependant, bien que connaître ce qui précède (et en particulier la convention de nommage en termes d'ajout de -dev) aide énormément lors du dépannage des problèmes et résoudra souvent le problème directement.

Cela aide également beaucoup de savoir comment les bibliothèques peuvent être vérifiées à l'aide de ldd, et enfin, de comprendre qu'une bibliothèque n'est qu'un fichier exécutable (mais pas directement) .so qui réside dans un sous-répertoire de /lib ou dans /usr/lib ou autre répertoires similaires.

Parfois, les bibliothèques et/ou les packages sont en conflit les uns avec les autres, ou certains packages nécessitent certaines versions de bibliothèques, ou certaines bibliothèques nécessitent d'autres bibliothèques, à des versions spécifiques elles-mêmes. Oui, cela devient un peu complexe. Il est également assez facile, quand cela devient aussi complexe, de gâcher légèrement un système. Parfois, il est même tout à fait possible de casser complètement l'installation d'un système d'exploitation en raison du déplacement d'une bibliothèque trop importante, etc.

Publicité

Souvent, il est un peu plus sûr de créer un lien symbolique (un lien virtuel avec un nom de fichier donné, faisant référence/lien vers un autre fichier existant ou un autre lien symbolique lui-même, qui à son tour pointe vers un fichier réel) pour une bibliothèque manquante dans une ancienne version, par exemple, et en pointant ce lien symbolique vers la dernière version installée. Cela ne fonctionne pas toujours, mais juste au cas où cela échouerait, le lien symbolique peut être supprimé, espérons-le plus sûr (en supposant qu'aucun lien symbolique ou fichier du même nom n'existait auparavant).

Le meilleur moyen Pour résoudre ces problèmes plus complexes, essayez toujours d'abord une solution basée sur apt (ou un outil de gestion de packages similaire sur votre système d'exploitation). À ce stade, vous voudrez également lire comment utiliser dkpg pour corriger apt, car il vous montre une manière plus granulaire de gérer les packages (bien que soyez prudent, car plus de contrôle s'accompagne de plus de responsabilités !).

Si tout le reste échoue, essayez de créer un lien symbolique, ou même ajoutez manuellement le fichier de bibliothèque. (Veuillez vous assurer que tout fichier téléchargé est exempt de virus, par exemple en le vérifiant avec VirusTotal, et il est toujours préférable d'utiliser les référentiels fournis par les fournisseurs de Linux pour télécharger les binaires.)

In extremis, vous pourrez également trouver une bibliothèque dans un système d'exploitation Linux voisin. Par exemple, un exécutable Ubuntu s'exécutera sur Mint et vice versa. Copier une bibliothèque à partir d'un autre PC que vous possédez est également une approche viable parfois.

Conclusion

Gestion fine de la bibliothèque est une compétence qui prend toute une vie à apprendre. C'est presque un art. Cet article a fourni les informations de base/le savoir-faire et les outils à utiliser et a énuméré quelques suggestions de dépannage plus avancées lorsque les choses deviennent troubles, et tôt ou tard, elles le seront si vous êtes un utilisateur fréquent de Linux qui installe régulièrement packages.

La prochaine fois que vous verrez l'”Erreur lors du chargement des bibliothèques partagées’ erreur sur votre machine Linux, vous serez mieux équipé pour comprendre d'où peut provenir le problème en utilisant un outil comme ldd, comme expliqué dans cet article. Nous avons également examiné les binaires statiques par rapport aux binaires compilés dynamiquement, et comment les bibliothèques partagées ou intégrées s'intègrent et fonctionnent avec les deux.

Publicité

Si vous avez apprécié cet article, vous aimerez peut-être aussi lire l'article sur dpkg lié ci-dessus ainsi que Comment ajouter l'univers, le multivers et les référentiels restreints dans Ubuntu.