Klebebindung
Anwendungen statisch linken mit Statifier und Ermine
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.
# 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.
# 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.



