sostituire il percorso della libreria esistente con un percorso personalizzato
Se questa è la tua libreria, probabilmente la stai collegando in questo modo:
$ cc -o prog1 -l/full/path/to/libABC.so prog1.o
invece del corretto:
$ cc -o prog1 -L/full/path/to/ -lABC prog1.o
Il primo approccio dice al linker Linux che l'applicazione ha bisogno proprio di quella libreria, solo quella libreria e nessun override dovrebbe essere possibile. Il secondo approccio indica che l'applicazione ha bisogno della libreria che verrebbe installata da qualche parte sul sistema, nel percorso della libreria predefinito o in uno indicato da $LD_LIBRARY_PATH (verrebbe cercato durante l'esecuzione). -L è usato solo durante il collegamento.
Altrimenti, invece di correggere l'ELF, controlla prima se puoi 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.
patchelf
è quello che vuoi
$ patchelf --replace-needed LIB_ORIGIN LIB_NEW ELF_FILE
Per vedere l'effetto
$ readelf -d ELF_FILE
Installare gli strumenti è facile:
$ sudo apt-get install patchelf readelf