Ersetzen Sie den Pfad zur vorhandenen Bibliothek durch einen benutzerdefinierten Pfad
Wenn dies Ihre eigene Bibliothek ist, verknüpfen Sie sie wahrscheinlich so:
$ cc -o prog1 -l/full/path/to/libABC.so prog1.o
statt des eigentlichen:
$ cc -o prog1 -L/full/path/to/ -lABC prog1.o
Der erste Ansatz teilt dem Linux-Linker mit, dass die Anwendung genau diese Bibliothek benötigt, nur diese Bibliothek und kein Überschreiben möglich sein sollte. Der zweite Ansatz besagt, dass die Anwendung die Bibliothek benötigt, die irgendwo auf dem System installiert werden würde, entweder im Standardbibliothekspfad oder in einem Pfad, auf den der $LD_LIBRARY_PATH verweist (der während der Laufzeit nachgeschlagen würde). -L wird nur während der Verbindungszeit verwendet.
Anstatt die ELF zu patchen, prüfen Sie andernfalls zuerst, ob Sie die Bibliothek mit einem Symlink ersetzen können. Dies ist der übliche Trick:Es ist schwierig, die ausführbare Datei nachträglich zu ändern, aber es ist sehr einfach, die Stelle der Symlink-Punkte zu ändern.
patchelf
ist, was Sie wollen
$ patchelf --replace-needed LIB_ORIGIN LIB_NEW ELF_FILE
Um den Effekt zu sehen
$ readelf -d ELF_FILE
Die Installation der Tools ist einfach:
$ sudo apt-get install patchelf readelf