Ich habe eine alte ausführbare Datei, die für den Schrotthaufen geplant ist, aber sie ist noch nicht da. Es basiert auf einigen Bibliotheken, die aus meiner Umgebung entfernt wurden, aber ich habe einige Stub-Bibliotheken an einem Ort, an dem es gut funktioniert. Ich möchte diese ausführbare Datei auf diese Stub-Bibliotheken verweisen. Ja, ich könnte LD_LIBRARY_PATH setzen, aber diese ausführbare Datei wird von vielen Skripten aufgerufen, und viele Benutzer und ich würden sie gerne an einer Stelle reparieren.
Ich habe keine Quelle dafür und wäre schwer zu bekommen. Ich dachte: Kann ich diese Datei mit einem ELF-fähigen Editor bearbeiten und rpath einen einfachen Pfad hinzufügen, damit sie die neuen Bibliotheken erreicht? Ist dies möglich oder wenn Sie eine ELF-Binärdatei erstellt haben, reparieren Sie Dinge an Orten und sie können nicht verschoben werden?
Antworten:
Es gibt ein Tool namens,
chrpath
das dies tun kann - es ist wahrscheinlich in den Paketen Ihrer Distribution verfügbar.quelle
install_name_tool
kann dies mit der-rpath
Flagge tun<binary>: no rpath or runpath tag found.
, können Sie es nicht verwendenchrpath
, um es zu ersetzen, aber Sie könnenpatchelf
in diesem Fall verwenden:patchelf --set-rpath /path/to/libaries <binary>
Es gibt ein universelleres Werkzeug als
chrpath
genanntpatchelf
. Es wurde ursprünglich für die Erstellung von Paketen für Nix und NixOS (Verpackungssystem und eine GNU / Linux-Distribution) erstellt.Falls in einer Binärdatei (hier rdsamp genannt) kein Pfad vorhanden ist,
chrpath
schlägt Folgendes fehl:Andererseits,
gelingt ganz gut.
quelle
patchelf
ist es möglich, einen Pfad zu einer Binärdatei hinzuzufügen, die noch keinen Pfad enthält - wobeichrpath
nur ein bereits vorhandener Eintrag geändert werden kann.rpath
und zu verstehenrunpath
. Grundsätzlich kann einer überschreibenLD_LIBRARY_PATH
und der andere nicht. Weitere Informationen finden Sie unter blog.tremily.us/posts/rpathchrpath
undpatchelf
mit ihrer Terminologie schlampig sind. Derpatchelf
oben gezeigte Befehl ändert sich beispielsweise,runpath
jedoch nur,rpath
wenn Sie auch die--force-rpath
Option angeben.patchelf
erklärt es: "--set-rpath
,--shrink-rpath
und--print-rpath
jetzt lieberDT_RUNPATH
überDT_RPATH
, die veraltet ist , wenn die Aktualisierung, wenn beide vorhanden sind, beide aktualisiert werden Wenn nur DT_RPATH vorhanden ist, wird es umgewandelt..DT_RUNPATH
Es sei denn ,--force-rpath
angegeben Wenn keiner vorhanden ist. wird aDT_RUNPATH
hinzugefügt, sofern--force-rpath
nicht anders angegeben. In diesem FallDT_RPATH
wird a hinzugefügt. " Der Name der Option wurde wahrscheinlich aus Kompatibilitätsgründen unverändert beibehalten.Genau wie @ user7610 sagte, ist der richtige Weg der
patchelf
Werkzeug.Ich bin jedoch der Meinung, dass ich eine umfassendere Antwort geben kann, die alle Befehle abdeckt, die erforderlich sind, um genau das zu tun.
Für einen umfassenden Artikel zu diesem Thema klicken Sie hier
Zunächst sprechen viele Entwickler darüber
RPATH
, aber sie meinen es tatsächlichRUNPATH
. Dies sind zwei verschiedene optionale dynamische Abschnitte, die vom Lader sehr unterschiedlich behandelt werden. Sie können mehr über den Unterschied zwischen ihnen in dem Link lesen, den ich zuvor erwähnt habe.Denken Sie vorerst daran:
RUNPATH
gesetzt,RPATH
wird ignoriertRPATH
ist veraltet und sollte vermieden werdenRUNPATH
wird bevorzugt, da es von überschrieben werden kannLD_LIBRARY_PATH
Siehe den aktuellen R [UN] -PFAD
Löschen Sie den R [UN] -PFAD
Anmerkungen:
RPATH
undRUNPATH
Addiere Werte zu R [UN] PATH
Anmerkungen:
<desired-path>
ist eine durch Kommas getrennte Verzeichnisliste, z./my/libs:/my/other/libs
--force-rpath
, setztRPATH
, sonst setztRUNPATH
quelle
-Wl,-R,<desired-rpath> -Wl,--enable-new-dtags
setztDT_RUNPATH
, und das ist das, was die meisten Leute verwenden sollten.RUNPATH
kann von überschrieben werdenLD_LIBRARY_PATH
, daher sollten Leute nicht verwenden--force-rpath
.<desired-path>
ein Doppelpunkt verwendet wird. Es sollte ein Komma sein (dh :)/my/libs,/my/other/libs
.Dies funktionierte für mich und ersetzte XORIGIN durch $ ORIGIN.
chrpath -r '\$\ORIGIN/../lib64' httpd
quelle