2010-07-08 12 views

risposta

3

sostituire percorso alla libreria esistente con un percorso personalizzato

Se questa è la vostra libreria, allora probabilmente lo collega così:

$ cc -o prog1 -l/full/path/to/libABC.so prog1.o 

al posto del corretto:

$ cc -o prog1 -L/full/path/to/ -lABC prog1.o 

Il primo approccio indica al linker di Linux che l'applicazione ha bisogno di pre Cisamente quella libreria, solo quella libreria e nessuna sostituzione dovrebbero essere possibili. Il secondo approccio dice che l'applicazione ha bisogno della libreria che dovrebbe essere installata da qualche parte nel sistema, nel percorso della libreria predefinito o in uno puntato da $ LD_LIBRARY_PATH (verrà cercato durante l'esecuzione). -L viene utilizzato solo durante il tempo di collegamento.

Altrimenti, invece di rattoppare l'ELF, prima controlla se è possibile sostituire la libreria usando un collegamento simbolico. Questo è il solito trucco: è difficile modificare l'eseguibile in seguito, ma è molto facile cambiare la posizione dei punti di collegamento simbolico.

1

È possibile controllare la variabile di ambiente LD_LIBRARY_PATH.

1

Se guardate la sezione .dynsym in Linux tramite readelf, ti basta vedere qualcosa di simile:

1: 0000000000000000 163 FUNC GLOBAL DEFAULT UND [email protected]_2.2.5 (2) 

che contiene solo un nome simbolico della libreria. Tuttavia, se si include le informazioni caricatore dinamico, si ottiene:

libc.so.6 => /lib/libc.so.6 (0x00002ba11da4a000) 
    /lib64/ld-linux-x86-64.so.2 (0x00002ba11d82a000) 

Così come detto, la cosa più facile da fare in assoluto (supponendo che si sta facendo questo per il debug, e non per sempre) sarebbe solo quello di creare un nuova sessione, esporta il tuo percorso personalizzato davanti allo LD_LIBRARY_PATH esistente e vai da lì.

Problemi correlati