Gibt es eine Open-Source-Möglichkeit, aus einer dynamischen ausführbaren Datei eine statische zu machen, ohne dass der Quellcode verfügbar ist?

20

Lassen Sie mich das Problem an einem Beispiel erläutern. Ich benutze ein altes Programm in meiner täglichen Arbeit, wie zum Beispiel xfig und pdfedit .

Jetzt sind diese Programme ziemlich alt und werden nicht zu oft aktualisiert. Ich befürchte, dass sie eines Tages nicht mehr funktionieren werden, weil eine Bibliothek oder ein inkompatibles Update fehlt.

Wenn das Programm jetzt auf einem laufenden System einfach zu kompilieren ist, ist die Lösung praktisch: Versuchen Sie, die Quelle ein wenig zu hacken und statisch zu kompilieren vorhersehbare Zukunft. Dies scheint der Fall zu sein xfigund ich werde es so schnell wie möglich versuchen.

Aber zum Beispiel pdfedithängt es von Qt3 ab, und das Einrichten eines Systems zum Kompilieren ist zu diesem Zeitpunkt ziemlich komplex. Glücklicherweise kann es jetzt ausgeführt werden, da die benötigte Bibliothek mit nichts in Konflikt steht. Das kann sich aber in Zukunft ändern, deshalb möchte ich dieses Problem lösen:

Wie kann ich eine statische Binärdatei (oder ähnliches) erstellen, wenn ich unter Ubuntu eine dynamische Bibliothek, aber keinen Quellcode habe?

Ich suchte herum. Eine Möglichkeit ist statifier (2), aber es gibt viele Probleme mit der Adress-Randomisierung , also ist es ein Nein-Nein. Die unfreie Version, Ermine , scheint zu funktionieren, aber ich würde wirklich eine Open-Source-Option vorziehen.

Eine andere Möglichkeit besteht darin, Docker oder ein ähnliches Verpackungssystem zu verwenden. Aber alle Tutorials, die ich gefunden habe, sind ganz auf RedHat ausgerichtet . und ehrlich gesagt ist es ziemlich komplex zu folgen.


Fußnoten :

(1) ist nicht so verrückt. Ich benutze zum Beispiel ein statisches ffmpeg , funktioniert einwandfrei und ohne Kompatibilitätsprobleme ...

(2) Informationen zum Kompilieren statifierfinden Sie unter /programming/23498237/compile-program-for-32bit-on-64bit-linux-os-causes-fatal-error

Rmano
quelle

Antworten:

19

Sie können Ihr Problem auf eine andere und einfachere Weise lösen:

Verwenden lddSie diese Option für Ihre ausführbare Datei, um die verknüpften Bibliotheken anzuzeigen. Beispiel:

$ ldd /bin/bash
linux-vdso.so.1 =>  (0x00007fffb2fd4000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007fac9ef91000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fac9ed8d000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fac9e9c6000)
/lib64/ld-linux-x86-64.so.2 (0x00007fac9f1e1000)

Sammeln Sie dann alle Bibliotheken in einem Ordner und legen Sie die Umgebungsvariable LD_LIBRARY_PATH fest, bevor Sie Ihr Programm ausführen, um auf diesen Ordner zu verweisen:

$ LD_LIBRARY_PATH="/opt/my_program/lib" /opt/my_program/start

Alternativ können Sie einen Eintrag für den Ordner lib hinzufügen /etc/ld.so.conf.d/. Aber das würde die Änderung systemweit anwenden.

Klaus D.
quelle
Dies ist eine gute Idee - obwohl ich wirklich gerne einen Weg finden würde, all dies in eine ausführbare Datei zu packen. Diese Lösung kann durch Änderungen im Lader beeinflusst werden (obwohl ich hoffe, dass niemand so etwas in nicht abwärtskompatibler Weise tun wird). Wird die Prämie vergeben, wenn keine besseren Lösungen entstehen - danke.
Rmano
Nun, Sie können dies zu einem kleinen Installationsskript hinzufügen und es mit dem lokalen Pfad verknüpfen. Ich mag diese Lösung, hätte sie vor einiger Zeit gebrauchen können.
WalyKu
1
@Klaus, linux-vdso.so.1 ist nirgends zu sehen, ich nehme an, es liegt im Kernel, richtig?
Rmano
1
Ja. From man 7 vdso: "Das" vDSO "(Virtual Dynamic Shared Object) ist eine kleine gemeinsam genutzte Bibliothek, die der Kernel automatisch dem Adressraum aller User-Space-Anwendungen zuordnet."
Klaus D.
Dies ist zwar keine strikte Antwort auf die Frage, aber eine vernünftige Problemumgehung. Vielen Dank.
Rmano
2

Ein Vorschlag zum Statifikator :

Wenn die Adressraum-Layout-Randomisierung (ASLR) fehlschlägt, müssen Sie sie nicht für den gesamten Computer ausschalten. Sie können es nur für diesen Prozess deaktivieren:

$ setarch `uname -m` -R statified_pdfedit [args...]

Dieser Befehl wird mit deaktiviertem zufälligem Layout ausgeführt (es muss kein Root sein).

Zitronenpresse
quelle
Wow interessant. Wenn ich nur kompilieren könnte statifier...
Rmano
Zusammengestellt und geprüft. xfig_statifiedimmernoch core dumps ... schade. Danke trotzdem.
Rmano
Ja, schade. Ich frage mich, ob es sich nicht um ein 64-Bit-Problem handelt. Versuchen Sie, statifier auf einem 32-Bit-Setup auszuführen.
Zitronenpresse
Auf einem 32-Bit-Computer überprüft, noch Core-Dumps.
Rmano