nahradit cestu ke stávající knihovně vlastní cestou
Pokud je toto vaše vlastní knihovna, pak ji pravděpodobně propojujete takto:
$ cc -o prog1 -l/full/path/to/libABC.so prog1.o
místo správného:
$ cc -o prog1 -L/full/path/to/ -lABC prog1.o
První přístup říká linuxovému linkeru, že aplikace potřebuje přesně tuto knihovnu, pouze tuto knihovnu a žádné přepsání by mělo být možné. Druhý přístup říká, že aplikace potřebuje knihovnu, která by byla nainstalována někde v systému, buď ve výchozí cestě knihovny, nebo v té, na kterou ukazuje $LD_LIBRARY_PATH (byla by vyhledána za běhu). -L se používá pouze během doby propojení.
V opačném případě místo opravy ELF nejprve zkontrolujte, zda můžete nahradit knihovnu pomocí symbolického odkazu. Toto je obvyklý trik:je těžké později upravit spustitelný soubor, ale je velmi snadné změnit umístění bodů symbolických odkazů.
patchelf
je to, co chcete
$ patchelf --replace-needed LIB_ORIGIN LIB_NEW ELF_FILE
Chcete-li vidět efekt
$ readelf -d ELF_FILE
Instalace nástrojů je snadná:
$ sudo apt-get install patchelf readelf