Modification de la bibliothèque liée pour un exécutable donné (CentOs 6)

29

J'ai un exécutable lié comme ceci:

  $ 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)
.
.

Où les bibliothèques libcrypto et libssl se trouvent dans les bibliothèques openssl 1.0.0-fips. Je veux plutôt expérimenter avec les bibliothèques 1.0.1, et je les ai donc construites dans mon répertoire personnel. Existe-t-il un moyen de se a.outrelier à mes nouvelles bibliothèques openssl sans trop de peine? Je voudrais éviter

  • Relier a.out(car les outils de construction sont extrêmement compliqués)
  • Modification de tous les paramètres globaux (car d'autres développeurs fonctionnent sur cette machine)

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

Fixee
la source

Réponses:

22

Vous pouvez temporairement remplacer 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és par deux points dans lequel les bibliothèques doivent être recherchées en premier, avant l'ensemble standard de répertoires; ceci est utile lors du débogage d'une nouvelle bibliothèque ou de l'utilisation d'une bibliothèque non standard à des fins spéciales. 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.preload. - Bibliothèques partagées

Vous pouvez également appeler directement le chargeur:

/lib/ld-linux.so.2 --library-path path executable

David Schwartz
la source
1
LD_LIBRARY_PATH ne remplace pas le chemin de recherche par défaut. Je l'ai défini, mais ldd me montre toujours le chemin par défaut du système, pas celui remplacé. Bien que je puisse forcer le chargement de ma propre bibliothèque en définissant LD_PRELOAD.
Calmarius
18

Écrivez un script wrapper qui définit la LD_LIBRARY_PATHvariable d'environnement. C'est le pendant des PATHbibliothèques partagées. Le chemin de recherche du système est toujours recherché après les répertoires répertoriés dans $LD_LIBRARY_PATH. Voir le manuel de l'éditeur de liens dynamiques pour référence.

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

Ou, pour une seule fois, directement sur la ligne de commande:

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

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

Gilles 'SO- arrête d'être méchant'
la source
2
+1 pour chrpath. Exactement ce dont j'avais besoin.
Raghav RV
Histoire mignonne, Microsoft est trop stupide pour passer 2 minutes à googler cela et conseille à tout le monde d'utiliser LD_LIBRARY_PATH plutôt que de lier SQL Server à openss-1.0.0 explicitement ou de recompiler à la version de openssl.so blogs.msdn.microsoft.com/sql_server_team /…
Evan Carroll