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

Contenu

texte de la bibliothèque sur fond blanc

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

Qu'est-ce qu'un Dépendance d'objet partagé?

Un objet partagé (aussi appelé bibliothèque) est un binaire (généralement pas directement exécutable) utilisé par plusieurs programmes / applications sur une instance Linux. Ces bibliothèques sont souvent installées au niveau du système d'exploitation et partagées (d'où le nom objet partagé O libraries) à l'usage d'un ou plusieurs (et même beaucoup) applications directement exécutables.

Par exemple, un programme qui inclut des fichiers compressés peut nécessiter la bibliothèque bz2 (bzip2) libbz2.so.1.0 pour le faire. Le terme Une bibliothèque Il est plus fréquemment utilisé dans les cercles Linux et est le jargon de choix parmi les professionnels, même si objet partagé (et bibliothèque partagée) sont tous les deux techniquement corrects. Il est également intéressant de noter que le .so L'extension de nom de fichier 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 est basé. Moins de bibliothèques, plus avancé (lors de la mise à jour de votre système d'exploitation, par exemple) sera la compatibilité. Plus de bibliothèques, plus il y a de chances que, tôt ou tard, toute dépendance à la bibliothèque est rompue. C'est aussi la raison pour laquelle les fournisseurs d'applications décident parfois de lancer statically compiled binaries au lieu de dynamically compiled binaries.

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 (disponible dans le système de développement au moment de la construction) compilé en binaire / exécutable résultant. Un binaire compilé dynamiquement utilisera les bibliothèques installées, disponible et partagé sur le système de l'utilisateur.

Comme vous pouvez le voir immédiatement, cela obligerait l'utilisateur à installer les dépendances requises, À moins que ceux-ci ne soient pris en charge dans le système d'exploitation ou dans le système de gestion des détails et des packages du fournisseur de l'application. C'est pourquoi exécuter une commande simple comme sudo apt install ...some_app... produira souvent un ensemble d'autres choses associées (En d'autres termes, bibliothèques requises) à co-installer en même temps.

La compilation statique et dynamique ont des avantages et des inconvénients. Par exemple, si vous utilisez une compilation statique et une bibliothèque que vous avez incluse dans votre progiciel (du point de vue d'un éditeur de logiciel) maintenant vous avez un bug de sécurité ou une mise à jour critique, vous devrez peut-être republier votre progiciel, même si rien n'a changé dans ton code.

Mais, de nouveau, faire confiance à l'utilisateur pour installer les bibliothèques, surtout pour les programmes complexes, ou lorsque l'auto-compilation du logiciel est nécessaire, sachant que les utilisateurs finaux ont souvent du mal avec de telles choses, ce n'est pas l'idéal non plus. C'est un domaine complexe et le sujet a souvent été discuté.

Aux fins de ce poste, nous analyserons les bibliothèques partagées en lien avec un programme qui a été compilé dynamiquement, comme c'est généralement le cas avec les programmes / exécutables / outils du système d'exploitation. Avec des programmes compilés statiquement (qui sont moins fréquents), il est très peu probable qu'une erreur telle que « Échec du chargement des bibliothèques partagées » s'affiche, puisque les bibliothèques sont incluses dans l'exécutable à moins que le programme ne soit partiellement dynamique et n'inclue qu'un ensemble limité de fichiers intégrés. dans les bibliothèques statiques.

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

Passons à racine mode pendant un certain temps (à l'aide de sudo su) et explorez le fonctionnement des bibliothèques partagées lorsqu'il s'agit d'un outil comme /usr/bin/zip qui est inclus ou peut être installé avec les principales distributions Linux.

Utiliser ldd sous Linux

Ici, nous changeons les répertoires en /usr/bin et vérifié si le zip Programme / des pistes / l'exécutable est présent. Le trouver présent, puis nous vérifions la version en l'invoquant avec --version et ne prenant que les deux premières lignes de la sortie canalisant la sortie (à l'aide de |) pour éviter une sortie longue donnée autrement.

Pour terminer, nous utilisons le ldd outil (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 a besoin de quatre bibliothèques partagées. La liste des bibliothèques requises est généralement au format de la bibliothèque requise, suivi d'un chemin où la bibliothèque nommée a déjà été trouvée.

Pour certaines bibliothèques de niveau supérieur ou spéciales au niveau du système d'exploitation (Quoi linux-vdso.so.1), aucun itinéraire de ce type n'est indiqué. Malgré cela, tant qu'aucune erreur n'est affichée dans aucune entrée, vous saurez qu'il est bon et disponible (ou est-ce préférable). En réalité, linux-vdso.so.1 C'est un objet / bibliothèque virtuelle partagée spéciale injectée dans chaque procédure par le noyau Linux, vous n'avez pas de fichier physique sur le disque pour le même. Il est là pour rendre les appels système plus efficaces.

Ensuite, cassons un peu les choses et renommez l'une des bibliothèques requises afin que le binaire ne puisse plus la découvrir automatiquement:

Erreur lors du chargement des bibliothèques partagées et de la bibliothèque manquante

Comme tu peux le voir, ici on change le nom / nous avons déplacé le fichier de /lib/x86_64-linux-gnu/libbz2.so.1.0 pour /lib/x86_64-linux-gnu/libbz2.so.1.0.NOT_PRESENT. Cela a cassé notre application zip, et quand nous essayons de l'exécuter, nous obtenons le redouté error while loading shared libraries Erreur. Malgré cela, en regardant d'un peu plus près, le message d'erreur est assez descriptif:

Zip *: français: 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 nom

Tout enregistrement et départ seront toujours soigneusement examinés par un ingénieur informatique expérimenté / informations sur le programme qui vous sont présentées avant de passer un appel par-dessus un obstacle. Là aussi ça vaudrait le coup, puisque le fichier requis est clairement affiché, libbz2.so.1.0, et le problème est aussi clairement montré. Il y a No such file or directory. En d'autres termes, libbz2.so.1.0 Il est perdu!

Nous pouvons également vérifier la même chose avec ldd, comme vous pouvez le voir sur la photo ci-dessus. Un nettoyage libbz2.so.1.0 => 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) charger et exiger des bibliothèques, et comment voir s'il en manque un (ou si vous en êtes informé par le message d'erreur), les choses ne fonctionnent pas. ça n'a plus l'air si compliqué.

En même temps, une fois que nous connaissons le nom de la bibliothèque requise, une recherche rapide sur votre moteur de recherche préféré affichera le module complémentaire à installer (va le réinstaller) pour obtenir le nom de bibliothèque requis. Très souvent, le nom du package peut même être construit directement à partir du nom de la bibliothèque. Malgré cela, pour ce cas, le nom de la bibliothèque d'exécution est un peu décalé.

Il existe deux types de bibliothèques: bibliothèques d'exécution et bibliothèques de développement. Dans cette circonstance, le nom du paquet qui contient le libbz2.so.1.0 la bibliothèque est probablement bzip2, et essayer de désinstaller casserait probablement plusieurs autres éléments, comme vous pouvez le voir sur une longue liste de programmes qui seront supprimés si vous essayez de désinstaller ou de purger le bzip2 emballer.

Le deuxième type de bibliothèque est une bibliothèque de développement. Souvent, Ceux-ci sont nécessaires lorsque vous essayez de compiler des programmes et, souvent, sont plus étroitement liés aux noms des fichiers de bibliothèque réels. Par exemple, sous Ubuntu, il suffit de prendre le nom de la bibliothèque et d'ajouter -dev. Par exemple, si nous voulions installer le package de développement lié au libbz2.so.1.0 emballer, nous pourrions envisager l'installation libbz2-dev:

Installation d'une bibliothèque de développement

Considérant que cette bibliothèque de développement n'est pas directement liée à notre libbz2.so.1.0 bibliothèque d'exécution, 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 parmi ceux) définitivement qu'une certaine bibliothèque de développement est requise (ce qui est généralement requis lors de la compilation de logiciels).

En même temps, supposons qu'une bibliothèque tombe en panne d'une manière ou d'une autre. Dans ce cas, l'une des solutions rapides les plus simples consiste à purger la bibliothèque sudo apt purge your_library_name commander (qui purgerait totalement la bibliothèque / programme passé), suivi d'une réinstallation à l'aide du sudo apt install your_library_name commander.

Et quand vous êtes dans une situation similaire à la précédente, où désinstaller la bibliothèque d'exécution que vous devez désinstaller / purger le programme principal, et où est la purge / la suppression est une partie trop importante du système d'exploitation ou cela affecterait beaucoup d'autres choses, vous pouvez utiliser une option de réinstallation à la place:

Réinstaller une application ou une bibliothèque

sudo apt réinstaller bzip2

Malgré cela, ce n'est pas toujours si simple, même en sachant ce qui précède (et surtout la convention de nommage en termes d'ajout -dev) aide énormément lors de la résolution des problèmes et, souvent, résoudra le problème directement.

Cela aide également beaucoup de savoir comment les bibliothèques peuvent être vérifiées en utilisant lddet, pour terminer, comprendre qu'une bibliothèque n'est qu'un exécutable (même si pas directement) .so fichier qui réside dans un sous-répertoire de /lib o fr /usr/lib ou d'autres répertoires similaires.

Parfois, 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, dans des versions spécifiques. Oui, ça devient un peu complexe. C'est aussi quelque chose de facile, quand ça devient si complexe, gâcher un peu le système. Parfois, il est même tout à fait envisageable d'interrompre complètement l'installation d'un système d'exploitation à cause du transfert d'une bibliothèque trop importante, etc.

Souvent, il est un peu plus sûr de créer un lien symbolique (un lien virtuel avec un nom de fichier spécifique, la sorcière fait référence à / liens vers un autre fichier existant ou un autre lien symbolique lui-même, qui à son tour pointe vers un vrai fichier) pour une bibliothèque restant dans une version précédente, à titre d'exemple et en pointant ce lien symbolique vers la dernière version installée. ça ne marche pas toujours, mais en cas d'échec, 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).

La meilleure façon de résoudre ces problèmes plus complexes est de toujours essayer un apt (ou un outil de gestion de packages similaire sur votre système d'exploitation), d'abord une solution. En ce point, vous voudrez également lire comment utiliser dkpg pour réparer apt, car il vous montre une manière plus granulaire de gérer les packages (Même en faisant attention, car plus de contrôle implique plus de responsabilité!).

Si tout le reste échoue, essayez de créer un lien symbolique ou même d'ajouter manuellement le fichier de bibliothèque. (S'il vous plait, assurez-vous que tous les fichiers téléchargés sont exempts de virus, par exemple, le vérifier avec VirusTotal, et il est toujours préférable d'utiliser les référentiels fournis par le fournisseur Linux pour télécharger les binaires).

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

Fin

La gestion fine des bibliothèques est une compétence à acquérir tout au long de la vie. C'est presque un art. Ce poste a fourni les informations / connaissances de base et outils à utiliser et a énuméré quelques conseils de dépannage plus avancés pour quand les choses deviennent troubles, et tôt ou tard, ils le feront si vous êtes un utilisateur Linux fréquent qui installez régulièrement des packages.

La prochaine fois que vous verrez l'erreur "Erreur de chargement des bibliothèques partagées’ sur votre machine Linux, vous serez mieux équipé pour comprendre d'où peut provenir le problème lorsque vous utilisez un outil comme ldd, comme expliqué dans ce post. Nous analysons également les binaires statiques par rapport aux binaires compilés dynamiquement., et comment les bibliothèques partagées ou intégrées s'adaptent et fonctionnent avec les deux.

Si vous avez aimé ce post, j'aimerais aussi lire l'article sur dpkg précédemment lié, ainsi que Comment ajouter l'univers, les référentiels multivers et restreints dans Ubuntu.

Abonnez-vous à notre newsletter

Nous ne vous enverrons pas de courrier SPAM. Nous le détestons autant que vous.