Anwendungen statisch linken mit Statifier und Ermine

Aus LinuxUser 05/2009

Anwendungen statisch linken mit Statifier und Ermine

© sxc.hu, Bananaism

Klebebindung

In der Fremde versagt der extra auf einen USB-Stick kopierte Terminplaner plötzlich den Dienst, weil ihm irgendeine Bibliothek nicht schmeckt. Die von Statifier und Ermine frisierten Programme laufen dagegen auf jeder beliebigen Distribution.

Gerade in größeren Anwendungen, wie etwa einer Textverarbeitung, nutzen die Anwender bei der täglichen Arbeit nur einen Bruchteil der angebotenen Funktionen. Damit die nicht genutzten Programmbestandteile nicht unnötig den Hauptspeicher verstopfen – OpenOffice bringt es immerhin auf über 200 MByte – lagern die Entwickler sie in spezielle Dateien aus. Unter Linux tragen diese so genannten dynamischen Bibliotheken die Dateiendung .so. Löst nun ein Benutzer eine Aktion aus, sucht das Programm nach der passenden Bibliothek, lädt sie in den Hauptspeicher und führt die entsprechende Funktion aus. Auf diese Weise bleiben Anwendungen nicht nur schlank, bei Updates aktualisieren Sie auch lediglich die betroffene Bibliothek.

Der modulare Aufbau bietet noch einen weiteren Vorteil: Programme dürfen sich Bibliotheken teilen (daher auch der englische Begriff “shared libraries”). Will eine Anwendung ihren Benutzern eine grafische Oberfläche bieten, so kann sie die Menüs, Schaltflächen und Listen selbst zeichnen – oder aber dazu die auf allen Distributionen sowieso vorhandenen GTK+- oder Qt-Bibliotheken nutzen. Dieser zweite Weg ist äußerst beliebt, weil er den Entwicklungsaufwand drastisch reduziert und nebenbei noch Speicherplatz spart.

Spürbares Verlangen

Den Haken an der Geschichte bekommen Anwender zu spüren, die zum Beispiel eine neue Programmversion installieren möchten. Dann müssen Sie erst einmal die Abhängigkeiten zu den verschiedenen Bibliotheken mühsam aufdröseln. Besonders hart trifft es meistens Multimedia-Begeisterte: Die entsprechende Software fordert in der Regel zahlreiche, mitunter recht exotische Bibliotheken an – wer etwa schon einmal das Schnittprogramm Kdenlive installieren wollte, kennt das Problem. Wie Listing 1 beweist, verlangen sogar simple Systemwerkzeuge wie ls gleich mehrere Bibliotheken. Glücklicherweise löst der Paketmanager meist sämtliche Abhängigkeiten schnell und unkompliziert auf.

Listing 1
# Von ls benötigte Bibliotheken
$ ldd /bin/ls
linux-gate.so.1 =>  (0xb8007000)
librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0xb7fd1000)
libselinux.so.1 => /lib/libselinux.so.1 (0xb7fb7000)
libacl.so.1 => /lib/libacl.so.1 (0xb7fae000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7e50000)
libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7e37000)
/lib/ld-linux.so.2 (0xb7fed000)
libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7e33000)
libattr.so.1 => /lib/libattr.so.1 (0xb7e2e000)

Haarig wird die Angelegenheit, wenn Sie “mal eben schnell” eine Anwendung auf einen anderen Rechner mitnehmen möchten oder eine sehr neue Software auf einem alten System ausführen wollen. An dieser Stelle rächt sich die Distributionsvielfalt: Damit das Programm auf dem Zielrechner überhaupt startet, müssen dort die erforderlichen Bibliotheken in exakt der von der Anwendung geforderten Version vorliegen. Selbst bei identischen Distributionen genügt häufig schon ein kleines Sicherheitsupdate, um eine zuvor herüber kopierte Anwendung schachmatt zu setzen.

Kluge Kleber

Hier kommen die beiden Werkzeuge Statifier und Ermine ins Spiel. Sie sammeln alle von einer Anwendung geforderten Bibliotheken ein und kleben sie an das ausführbare Programm. Das Ergebnis ist ein statisch gelinktes Programm (siehe Kasten “Statisch oder dynamisch?”), das prinzipiell auf allen Distributionen läuft. Einen Strich durch die Rechnung macht höchstens die Prozessorarchitektur: So läuft eine 64-Bit-Anwendung auch nach der Sonderbehandlung nicht auf einem 32-Bit-System. Umgekehrt funktioniert allerdings ein statisch gelinktes 32-Bit-Programm auf einem 64-Bit-Linux, ohne dass Sie mühevoll eine entsprechende Umgebung einrichten müssen.

Statifier [1] unterliegt der GPL; für Fedora, Mandriva und Slackware existieren fertige Pakete. Auf allen anderen Distributionen müssen Sie zum Quellcode-Archiv greifen. Achten Sie dabei darauf, dass Sie das Paket statifier in der aktuellsten Version erwischen (nicht rrp_statify). Haben Sie es auf die Festplatte entpackt, übersetzen und installieren Sie es mit administrativen Rechten mittels des Zweizeilers:

# make
# make install

Die proprietär lizenzierte und kostenpflichtige Statifier-Alternative Ermine [2] gibt es ausschließlich in zwei kostenpflichtigen Geschmacksrichtungen: Ermine Light liefert lediglich die Basisfunktionen, ist dafür aber auch etwas günstiger als Ermine Pro, das neben den Bibliotheken auf Wunsch noch weitere Dateien mit einpackt (dazu später noch mehr). Auf der Homepage stehen beide Varianten als fertige Testversionen bereit. Sie müssen lediglich die zu Ihrem System passende Datei herunterladen und Sie dort ausführbar machen. Die mit den Testversionen behandelten Programme laufen übrigens nur 30 Tage lang, wie Listing 2 zeigt.

Listing 2
# die Trial-Version von Ermine meldet sich
$ ./ErmineLightTrial.i386 /bin/ls --output=staticls
$ ldd staticls
        not a dynamic executable
$ ./staticls
staticls: was packed with Ermine Trial and should be used for evaluation only.
staticls: license will expire in 31 day(s)
ErmineLightTrial.i386  staticls

Statisch oder dynamisch?

Bibliotheken gibt es in statischen und dynamischen Varianten. Mit den erstgenannten kommen Sie als normaler Anwender nicht oder nur sehr selten in Kontakt; diese besitzen die Endung .a und verschmelzen bereits bei der Übersetzung des Programms mit diesem. Dieser Prozess heißt auch statische Bindung, englisch “static linking”, das Ergebnis ist ein statisch gelinktes Programm. Sofern Sie Zugriff auf den Quellcode einer Anwendung besitzen, könnten Sie folglich auch ohne die Hilfe von Statifier oder Ermine ein unabhängiges Programm backen.

Dynamische Bibliotheken tragen die Endung .so und landen erst dann im Hauptspeicher, wenn das bereits fertige Programm nach seinem Start die darin enthaltenen Funktionen anfordert beziehungsweise aufruft. Ergo müssen Sie mit der Anwendung auch immer die dynamischen Bibliotheken ausliefern – oder sicherstellen, dass die entsprechende Distribution diese mitbringt.

Schnürende Statiker

Als nächstes wenden Sie sich dem Programm zu, das Sie in eine portable Anwendung verwandeln möchten. Von ihm benötigen Sie den Aufenthaltsort sowie den Namen der ausführbaren Programmdatei. Diesen übergeben Sie nun zusammen mit dem gewünschten Namen der statisch gelinkten Datei an Ermine oder Statifier. So rafft letzterer beispielsweise per

$ statifier /bin/ls staticls

alle von ls benötigten Bibliotheken zusammen, tackert sie an dem Binary fest und legt das Ergebnis unter dem Namen staticls ab. Im Fall von Ermine führt folgender Einzeiler zum gleichen Ergebnis:

$ ./ErmineLightTrial.i386 /bin/ls --output=staticls

Das statisch gelinkte Programm legt gegenüber dem Original extrem an Umfang zu. Das ls-Kommando blähen die angefügten Bibliotheken beispielsweise von schlanken 93 KByte auf rund 2 MByte auf. Wie Listing 2 zeigt, besitzt es jedoch im Gegenzug keine Abhängigkeiten und läuft somit auf jeder beliebigen Distribution.

Die Tabelle “Programmgrößen unter Ubuntu 8.10” vergleicht noch ein paar weitere von Statifier und Ermine produzierte Ergebnisse. Das kommerzielle Ermine arbeitet zwar meist etwas effizienter als der quelloffene Kollege, erfreulicherweise gehen jedoch beide recht flott zu Werke: Auf einem Core-2-Duo-Rechner lagen in allen Fällen nach maximal 4 Sekunden die modifizierten Anwendungen vor – mit einer Ausnahme: Bei dem Versuch, das kleine Spielchen Gnometris in ein statisch gelinktes Programm zu verwandeln, verfing sich Statifier reproduzierbar in einer Endlosschleife.

Programmgrößen unter Ubuntu 8.10

Programm Original Statifier Ermine Light
ls 96.216 Byte 1.990.656 Byte 2.279.044 Byte
Gnuchess 172.164 Byte 3.112.960 Byte 2.560.132 Byte
VICE 1.235.844 Byte 19.603.456 Byte 16.070.240 Byte
Gnometris 116.032 Byte 21.050.976 Byte

Da sie Bibliotheken nicht umständlich auf der Festplatte suchen, laufen statisch gelinkte Programme prinzipiell etwas schneller ab. Bei kleineren Werkzeugen wie ls bleiben die Unterschiede jedoch verschwindend gering.

Pferdefüße und Ausfallerscheinungen

Statisch gelinkte Programme bringen aber auch Nachteile mit sich: So können Sie etwa keine (Sicherheits-)Updates mehr einspielen. Erscheint eine aktualisierte Version des Programms oder einer der verwendeten Bibliotheken, müssen Sie erneut Ermine oder Statifier anwerfen.

Letzterer kämpft noch mit einem ganz besonderen Problem: Durchweg alle modernen Distributionen arbeiten mit aktivierter Stack- und Address-Space-Layout-Randomization (ASLR, [3]). Dabei weist der Linux-Kernel jeder Bibliothek und jedem Programm einen zufällig gewählten Platz im Hauptspeicher zu. Das soll die Sicherheit erhöhen und Angriffe erschweren, bringt aber auch Statifier vollkommen durcheinander. In der Folge produziert die Software unbrauchbare Programme, die direkt nach ihrem Start mit einem Speicherfehler (“Segmentation Fault”) kollabieren (siehe Listing 3).

Die derzeit einzige Abhilfe besteht darin, ASLR vorübergehend abzuschalten. Dazu melden Sie sich als Benutzer mit Root-Rechten an und schreiben in die passende virtuelle Datei eine Null. Anschließend überprüfen Sie durch Ausgabe der Datei, ob die Einstellungen passen:

# echo 0 > /proc/sys/kernel/randomize_va_space
# cat /proc/sys/kernel/randomize_va_space
0

Jetzt erstellen Sie mit Statifier das gewünschte Programm noch einmal. Dummerweise müssen Sie ASLR so lange deaktivieren (auch auf anderen Systemen), wie Sie mit der statisch gelinkten Anwendung arbeiten. Ob das die geschaffene Sicherheitslücke aufwiegt, müssen Sie selbst entscheiden.

Listing 3
# Adress Space Randomization abschalten
$statifier /bin/ls staticls
$./staticls
Segmentation fault
$sudo su
root@kkissling# echo 0 > /proc/sys/kernel/randomize_va_space
root@kkissling# exit
exit
$statifier /bin/ls staticls
$./staticls
Bilder   Dokumente  lost+found  […]

Trouble mit OpenSuse 11.1

Unter OpenSuse 11.1 meldete Statifier ein Problem mit dem Debugger gdb und erstellte keine statische Version von ls. Es half, die Zeilen 42 bis 46 in der Datei /usr/lib/statifier/32/statifier_dump.sh mit Hilfe einer Raute (#) auszukommentieren, wozu Sie Root-Rechte brauchen. Nach dem Speichern der veränderten Datei, erledigte Statifier den Job, ohne zu murren.

Noch mehr Gerümpel

Statifier und die Light-Fassung von Ermine binden ausschließlich dynamische Bibliotheken ein, wobei unter Statifier die kritischen Bibliotheken NSS (“Name Service Switch”) und Gconv (für die Konvertierung von Zeichensätzen) grundsätzlich draußen bleiben müssen. Insbesondere Spiele bringen jedoch meist noch zusätzliches Material in Form von Bildern oder Audiodateien mit, während Anwendungsprogramme gerne Übersetzungen in zahlreichen .mo-Dateien anhäufen. Sie alle müssen ebenfalls auf den neuen Computer umziehen. Nur Ermine Pro bietet an, derartige plattformunabhängige Daten mit in das statisch gelinkte Programm aufzunehmen. Zusätzlich kann die teuerste Variante im Feld mehrere, sich nacheinander aufrufende Programme zu einem einzigen verschmelzen.

Fazit

Aufgrund seiner zahlreichen Mängel ist Statifier unter dem Strich höchstens für kleinere Kommandozeilenwerkzeuge brauchbar. Die Alternative Ermine kostet hingegen wieder Geld – wie viel genau, bleibt Verhandlungssache mit dem Hersteller. Für den privaten Anwender lohnt es sich da eher, ein komplettes Live-System zusammenzustellen – zumal Ubuntu bereits entsprechende Werkzeuge mitbringt. Umfassende Rettungsmedien finden Sie im Internet sogar zuhauf.

LinuxUser 05/2009 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben