Es gibt ein universelleres Tool als chrpath
genannt patchelf
. Es wurde ursprünglich zur Verwendung beim Erstellen von Paketen für Nix und NixOS (Paketsystem und eine GNU/Linux-Distribution) erstellt.
Falls es keinen rpath in einer Binärdatei gibt (hier rdsamp genannt), chrpath
schlägt fehl:
chrpath -r '$ORIGIN/../lib64' rdsamp
rdsamp: no rpath or runpath tag found.
Andererseits
patchelf --set-rpath '$ORIGIN/../lib64' rdsamp
gelingt prima.
Es gibt ein Tool namens chrpath
das kann das - es ist wahrscheinlich in den Paketen Ihrer Distribution verfügbar.
Genau wie @user7610 sagte, der richtige Weg ist der patchelf
Werkzeug.
Aber ich habe das Gefühl, dass ich eine umfassendere Antwort geben kann, die alle Befehle abdeckt, die man braucht, um genau das zu tun.
Für einen umfassenden Artikel zu diesem Thema klicken Sie hier
Zunächst einmal sprechen viele Entwickler von RPATH
, aber eigentlich bedeuten sie RUNPATH
. Dies sind zwei verschiedene optionale dynamische Abschnitte, und der Lader handhabt sie sehr unterschiedlich. Sie können mehr über den Unterschied zwischen ihnen in dem Link lesen, den ich zuvor erwähnt habe.
Denken Sie vorerst nur daran:
- Falls
RUNPATH
gesetzt ist,RPATH
wird ignoriert RPATH
ist veraltet und sollte vermieden werdenRUNPATH
wird bevorzugt, da es durchLD_LIBRARY_PATH
überschrieben werden kann
Siehe den aktuellen R[UN]PATH
readelf -d <path-to-elf> | egrep "RPATH|RUNPATH"
Löschen Sie den R[UN]PATH
patchelf --remove-rpath <path-to-elf>
Hinweise:
- Entfernt beide
RPATH
undRUNPATH
Werte zu R[UN]PATH hinzufügen
patchelf [--force-rpath] --set-rpath "<desired-rpath>" <path-to-elf>
Hinweise:
<desired-path>
ist eine durch Doppelpunkte getrennte Verzeichnisliste, z. B.:/my/libs:/my/other/libs
- Wenn Sie
--force-rpath
angeben , setztRPATH
, setzt andernfallsRUNPATH