Est-il correct (ou non) de créer un lien symbolique entre les bibliothèques pour surmonter les erreurs «impossible d'ouvrir un objet partagé»?

12

Parfois, pour une raison ou une autre, un programme n'a pas spécifié ou inclus toutes ses dépendances correctement, et son démarrage entraîne des erreurs indiquant des dépendances manquantes. Une erreur typique est quelque chose comme:

cannot open shared object libudev.so.0

Je vois beaucoup de réponses conseillant aux gens de contourner ces problèmes en créant des liens symboliques dans /usr/libou à d'autres emplacements du système, et cela semble souvent résoudre le problème. Mais je vois un nombre égal de commentaires informant les gens que c'est une mauvaise idée. Voici une réponse représentative.

Dans quelles circonstances est-il acceptable de créer un lien symbolique entre une bibliothèque pour faire fonctionner un programme? Jamais? Parfois? Que faire si vous supprimez le lien symbolique après avoir terminé d'exécuter le programme?

Quelles sont les conséquences de faire cela?

John Feminella
la source

Réponses:

12

Le problème avec la création de ces liens est qu'ils ne sont pas gérés de manière significative. Si cette bibliothèque est supprimée, le lien est rompu. Si la bibliothèque est mise à niveau, elle peut rencontrer une erreur en raison du lien auquel elle ne s'attend pas.

De plus, vous mentez essentiellement au système. Dans l'exemple lié, vous prétendez que libudev.so.1c'est effectivement le cas libudev.so.0. Ils sont nommés différemment pour une raison (différentes versions de la bibliothèque). Bien que cela puisse fonctionner très bien pour certains programmes, il est possible que des différences entre les versions provoquent des problèmes (tels qu'un défaut de segmentation ou un autre comportement inattendu).

Donc, si vous créez spécifiquement ce lien juste pour qu'un programme s'exécute et que vous savez que vous le supprimerez plus tard, vous résolvez le premier problème mais pas le second. Bien que cela règle le problème principal, ce n'est pas idéal.

La solution idéale est bien sûr d'installer la bonne version de la bibliothèque (la réponse acceptée sur votre exemple lié), ou de compiler le programme avec la version que vous avez.

Nattgew
la source