web-dev-qa-db-fra.com

Changement de bibliothèque liée pour un exécutable donné (Centos 6)

J'ai un exécutable lié comme celui-ci:

  $ ldd a.out
        libboost_system-mt.so.1.47.0 => /usr/lib64/libboost_system-mt.so.1.47.0 (0x00007f4881f56000)
        libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f4881cfb000)
        libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007f4881965000)
        librt.so.1 => /lib64/librt.so.1 (0x00007f488175d000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f4881540000)
        libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f4881239000)
.
.

Lorsque les bibliothèques libcrypto et Libssl sont OpenSSL 1.0.0-FIPS Libs. Je veux plutôt expérimenter avec les bibliothèques 1.0.1, et donc je les ai construits dans mon répertoire personnel. Y a-t-il un moyen d'obtenir a.out Pour relier à mes nouvelles bibliothèques OpenSSL sans beaucoup de douleur? Je voudrais éviter

  • Avoir à relier a.out (parce que les outils de construction sont massivement compliqués)
  • Modifier tous les paramètres globaux (car d'autres Devs fonctionnent sur cette machine)

Est-il possible de faire ce que j'espère ici?

29
Fixee

Vous pouvez substituer temporairement une bibliothèque différente pour cette exécution particulière. Sous Linux, la variable d'environnement LD_Library_Path est un ensemble de répertoires séparé par deux points où les bibliothèques doivent être recherchées pour la première fois avant l'ensemble standard de répertoires; Ceci est utile lors du débogage d'une nouvelle bibliothèque ou d'une bibliothèque non standard à des fins particulières. La variable d'environnement LD_PRELOAD répertorie les bibliothèques partagées avec des fonctions qui remplacent l'ensemble standard, tout comme /etc/ld.so.procharte. - Bibliothèques partagées

Vous pouvez également appeler directement le chargeur:

/LIB/LD-LINUX.SO.2-LIBRARY-PATH path _ executable

22
David Schwartz

Écrivez un script wrapper qui définit le LD_LIBRARY_PATH variable d'environnement. Ceci est le pendentif de PATH pour les bibliothèques partagées. Le chemin de recherche du système est toujours recherché après les répertoires énumérés dans $LD_LIBRARY_PATH. Voir le Manuel Dynamic Linker pour référence.

#!/bin/sh
export LD_LIBRARY_PATH=~/opt/openssl-1.0.1/lib
exec /path/to/a.out "$@"

Ou, pour un seul off, directement sur la ligne de commande:

LD_LIBRARY_PATH=~/opt/openssl-1.0.1/lib ./a.out

Sinon, si vous souhaitez modifier le binaire, essayez chrpath , ce qui vous permet de modifier le chemin de recherche de la bibliothèque cuit dans l'exécutable.