remplacer le chemin d'accès à la bibliothèque existante par un chemin personnalisé
S'il s'agit de votre propre bibliothèque, vous l'avez probablement liée comme ceci :
$ cc -o prog1 -l/full/path/to/libABC.so prog1.o
au lieu du propre :
$ cc -o prog1 -L/full/path/to/ -lABC prog1.o
La première approche indique à l'éditeur de liens Linux que l'application a précisément besoin de cette bibliothèque, seule cette bibliothèque et aucun remplacement ne devrait être possible. La deuxième approche indique que l'application a besoin de la bibliothèque qui serait installée quelque part sur le système, soit dans le chemin de la bibliothèque par défaut, soit dans celui pointé par $LD_LIBRARY_PATH (serait recherché pendant l'exécution). -L n'est utilisé qu'au moment de la liaison.
Sinon, au lieu de patcher l'ELF, vérifiez d'abord si vous pouvez remplacer la bibliothèque en utilisant un lien symbolique. C'est l'astuce habituelle :il est difficile de modifier l'exécutable par la suite, mais il est très facile de changer l'emplacement des points de lien symbolique.
patchelf
est ce que vous voulez
$ patchelf --replace-needed LIB_ORIGIN LIB_NEW ELF_FILE
Pour voir l'effet
$ readelf -d ELF_FILE
Installer les outils est facile :
$ sudo apt-get install patchelf readelf