J'ai un exécutable binaire nommé "alpha" qui nécessite une bibliothèque liée (libz.so.1.2.7) qui est placée à /home/username/myproduct/lib/libz.so.1.2.7
J'exporte le même vers mon instance de terminal avant de générer mon exécutable binaire en exécutant la commande suivante.
export LD_LIBRARY_PATH=/home/username/myproduct/lib/:$LD_LIBRARY_PATH
Maintenant, quand je lance une autre application "bravo" qui nécessite la même bibliothèque mais de version différente, c'est-à-dire (libz.so.1.2.8) qui est disponible dans
/lib/x86_64-linux-gnu/libz.so.1.2.8
, le système lance l'erreur suivante.
version `ZLIB_1.2.3.3' not found (required by /usr/lib/x86_64-linux-gnu/libxml2.so.2)
Si je désactive le LD_LIBRARY_PATH
, "bravo" démarre bien. Je comprends que le comportement ci-dessus est dû à la LD_LIBRARY_PATH
priorité sur les chemins de répertoire définis dans /etc/ld.so.conf
lors de la recherche de bibliothèques liées et, par conséquent, l'erreur ci-dessus s'est produite. Je suis simplement curieux de savoir pourquoi les développeurs d'UNIX / LINUX n'ont pas conçu le système d'exploitation pour rechercher des bibliothèques liées dans d'autres répertoires selon la hiérarchie si la première instance de bibliothèque est de version différente.
Autrement dit, les systèmes UNIX / LINUX parcourent un ensemble de répertoires jusqu'à ce qu'ils trouvent la bibliothèque requise. Mais pourquoi ne fait-il pas la même chose jusqu'à ce qu'il trouve la version attendue plutôt que d'accepter la première instance de bibliothèque quelle que soit sa version?
la source
libz.so.1
est un lien symbolique verslibz.so.1.2.8
Réponses:
Il le fait, à sa connaissance.
zlib.so.1.2.7
et leszlib.so.1.2.8
deux ont un sonamezlib.so.1
, donc vos binairesalpha
et euxbravo
disent qu'ils en ont besoinzlib.so.1
. Le chargeur dynamique charge la première bibliothèque correspondante qu'il trouve; il ne sait pas que la version 1.2.8 fournit des symboles supplémentaires dont il abravo
besoin. (C'est pourquoi les distributions s'efforcent de spécifier des informations de dépendance supplémentaires, commezlib1g (>= 1.2.8)
pourbravo
.)Vous pourriez penser que cela devrait être facile à corriger, mais ce n'est pas le cas, notamment parce que les binaires et les bibliothèques répertorient les symboles dont ils ont besoin séparément des bibliothèques dont ils ont besoin, de sorte que le chargeur ne peut pas vérifier qu'une bibliothèque donnée fournit tous les symboles qui en sont nécessaires. Les symboles peuvent être fournis de différentes manières, et l'introduction d'un lien entre les symboles et les bibliothèques qui les fournissent pourrait casser les fichiers binaires existants. Il y a aussi le plaisir supplémentaire de l'interposition de symboles pour compliquer les choses (et faire en sorte que les développeurs sensibles à la sécurité se déchirent les cheveux).
Certaines bibliothèques fournissent des informations de version qui finissent par être stockées dans
.gnu.version_r
, avec un lien vers la bibliothèque fournissant, ce qui aiderait ici, maislibz
n'en fait pas partie.(Compte tenu des sonames, je m'attends à ce que votre
alpha
binaire fonctionne correctementzlib.so.1.2.8
.)la source
zlib
n'utilise pas delibtool
toute façon, sauf sur Darwin où c'estar
;-).