Wie kann ich den Dateinamen einer gemeinsam genutzten Bibliothek ändern, um ein Programm nach dem Aufbau, der davon abhängt?

StackOverflow https://stackoverflow.com/questions/2759254

Frage

ich ein Programm, das auf einer gemeinsam genutzten Bibliothek hängt es tief in einer Verzeichnisstruktur zu finden erwartet. Ich möchte, dass die gemeinsam genutzte Bibliothek und in einen besseren Ort bewegen. Unter OS X, kann dies mit install_name_tool erfolgen. Ich bin nicht in der Lage einen Äquivalent für Linux zu finden.

Als Referenz readelf -d myprogram spuckt folgende paraphrasierte Ausgabe:

Dynamic section at offset 0x1e9ed4 contains 30 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [this/is/terrible/library.so]
 0x00000001 (NEEDED)                     Shared library: [libGL.so.1]
 0x00000001 (NEEDED)                     Shared library: [libGLU.so.1]
 0x00000001 (NEEDED)                     Shared library: [libstdc++.so.6]
(continues in an uninteresting fashion)

(und auf Anfrage, ldd myprogram:)

    linux-gate.so.1 =>  (0x0056a000)
    this/is/terrible/library.so => not found
    libGL.so.1 => /usr/lib/mesa/libGL.so.1 (0x0017d000)
    libGLU.so.1 => /usr/lib/libGLU.so.1 (0x00a9c000)
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00710000)
   (etc, etc)

und ich möchte errata wie "dieses / is / schrecklich / library.so" auf "/ library.so geteilt" werden. Beachten Sie, dass, wenn das Programm in seiner „gebaut“ Lage gelassen wird, wo der relative Pfad diese / ist / schrecklich / library.so tatsächlich existiert, dann ldd der Lage ist, es zu finden, wie man erwarten würde.

Ich weiß, über RPATH und es ist nicht das, was ich suche, ich global nicht ändern müssen, um Suchpfade.

War es hilfreich?

Lösung

HT - dies könnte hilfreich sein.

HT ist ein Datei-Editor / Viewer / Analysator für ausführbare Dateien. Das Ziel ist es, die Low-Level-Funktionalität eines Debuggers und die Nutzbarkeit von IDEs zu kombinieren. Wir planen, alle (Hex-) Bearbeitung Funktionen und Unterstützung der wichtigsten Dateiformate zu implementieren.

Ich kann nicht etwas viel anders aus ZorbaTHut Lösung finden, aber vielleicht ist es möglich, einen Namen mit unterschiedlicher Länge zu setzen und immer noch den binären gültig.

GELF - auch dies nützlich sein könnte.

GELF ist ein allgemeiner, ELF klassenunabhängige API für manipulat- ing ELF Objektdateien. GELF bietet eine einzige, gemeinsame inter- Gesicht für 32-Bit- und 64-Bit-ELF-Format mit Objektdateien.

Andere Tipps

Wir verwenden patchelf :

patchelf --replace-needed liboriginal.so.1 libreplacement.so.1 my-program

Wir können auch eine Abhängigkeit entfernen:

patchelf --remove-needed libfoo.so.1 my-program

Fügen Sie eine Abhängigkeit:

patchelf --add-needed libfoo.so.1 my-program

oder den Pfad ändern, in dem für die Bibliotheken suchen ( rpath ):

patchelf --set-rpath /path/to/lib:/other/path my-program

Posting ein vorläufiger, schrecklich, hacky Lösung.

Die Bibliothek Abhängigkeiten werden in einem ELF-Block als .depends Block bekannt gespeichert. Das Format des Blocks ist eine große Palette von Identifikator / stringpointer Paare, wobei der stringpointer im binären zu einer Standard-C-null-terminierte Zeichenkette befindet sich irgendwo zeigt.

Sie sehen, wohin dieses geht, nicht wahr?

Ja, solange der neue Weg, den Sie brauchen, ist nicht größer als der alte Weg, können Sie einfach direkt in das binäre erreichen und machen Sie einen einfachen String ersetzen. Achten Sie darauf, nicht hinzuzufügen oder zu entfernen Bytes, oder Sie werden die ganze binäre zu brechen. Wenn man darüber als sicherer wollen, könnten Sie eigentlich die ELF-Struktur durchlaufen, um sicherzustellen, dass Sie den richtigen Standort hatte -. Jetzt bin ich überprüft, nur um sicher die Quellzeichenfolge zeigt sich genau einmal machen

hat ELF eine Prüfsumme umfassen, aber anscheinend gibt es keinen loader dass tatsächlich überprüft es, so ist es „sicher“ - wenn auch chaotisch -. Ignorieren

Die „echte Lösung“ wäre ein Dienstprogramm, dass erlaubt Low-Level generali Manipulationen der ELF-Struktur. So nahe, wie ich sagen kann, existiert kein solches Dienstprogramm für alles außer ein paar spezielle Fälle (RPATH, meistens.) Ich gebe vor, um zu schreiben, nicht zu wissen, wie schwierig ein solches Nutzen sein würde.

Ich würde es absolut lieben, eine bessere Lösung für dieses Problem, aber so weit, dies scheint zu arbeiten.

Sie können LD_LIBRARY_PATH verwenden den Suchpfad für gemeinsam genutzte Bibliotheken zu ändern. Wenn Ihr Programm auf einem bestimmten relativen Pfad wie Ihr Beispiel zeigt, hängt, müssen Sie immer noch, dass Verzeichnisstruktur haben. Mit anderen Worten können Sie die lib von /home/user/dev/project/this/is/terrible/library.so zu /usr/local/lib/this/is/terrible/library.so bewegen, aber nicht zu /usr/local/lib/library.so

Wenn Sie Ihr Programm neu erstellen können, dann können Sie den relativen Pfad für die lib verwendet ändern.

Es gibt einige weitere Informationen auf gemeinsam genutzten Bibliotheken in Linux unter http: / /tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top