Modifica della libreria collegata per un determinato eseguibile (CentOs 6)


29

Ho un eseguibile collegato in questo modo:

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

Dove sono le librerie libcrypto e libssl si aprono libss 1.0.0-fips. Voglio invece sperimentare con le librerie 1.0.1 e quindi le ho costruite nella mia directory home. C'è un modo per a.outricollegare le mie nuove librerie openssl senza molto dolore? Vorrei evitare

  • Dover ricollegare a.out(perché gli strumenti di costruzione sono enormemente complicati)
  • Modificare qualsiasi impostazione globale (perché altri sviluppatori lavorano su questa macchina)

È possibile fare quello che spero qui?

Risposte:


22

È possibile sostituire temporaneamente una libreria diversa per questa particolare esecuzione. In Linux, la variabile d'ambiente LD_LIBRARY_PATH è un set di directory separato da due punti in cui le librerie devono essere ricercate per prime, prima del set standard di directory; questo è utile quando si esegue il debug di una nuova libreria o si utilizza una libreria non standard per scopi speciali. La variabile d'ambiente LD_PRELOAD elenca le librerie condivise con funzioni che sovrascrivono il set standard, proprio come fa /etc/ld.so.preload. - Librerie condivise

Puoi anche richiamare direttamente il caricatore:

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


1
LD_LIBRARY_PATH non sostituisce il percorso di ricerca predefinito. L'ho impostato ma ldd mi mostra ancora il percorso predefinito del sistema, non quello ignorato. Anche se posso forzare il caricamento della mia libreria impostando LD_PRELOAD.
Calmarius,

18

Scrivi uno script wrapper che imposta la LD_LIBRARY_PATHvariabile di ambiente. Questo è il ciondolo delle PATHlibrerie condivise. Il percorso di ricerca del sistema viene sempre cercato dopo le directory elencate in $LD_LIBRARY_PATH. Consultare il manuale del linker dinamico per riferimento.

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

Oppure, per una tantum, direttamente sulla riga di comando:

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

In alternativa, se si desidera modificare il file binario, provare chrpath , che consente di modificare il percorso di ricerca della libreria cotto nell'eseguibile.


2
+1 per chrpath. Esattamente quello di cui avevo bisogno.
Raghav RV,

Storia carina, Microsoft è troppo stupida per spendere 2 minuti su Google e consiglia a tutti di usare LD_LIBRARY_PATH anziché collegare esplicitamente SQL Server a openss-1.0.0 o ricompilare la versione di openssl.so blogs.msdn.microsoft.com/sql_server_team / ...
Evan Carroll,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.