Statisches vs. dynamisches Linken: Unterschiede im Überblick

Linken verbindet Ihren kompilierten Code mit dem Bibliothekscode, den er verwendet. Beim statischen Linken wird der benötigte Bibliothekscode zur Build-Zeit in die ausführbare Datei kopiert, sodass das Programm eigenständig ist. Beim dynamischen Linken vermerkt die ausführbare Datei nur, welche gemeinsam genutzten Bibliotheken sie braucht, und das Betriebssystem lädt sie beim Programmstart, sodass viele Programme eine Kopie gemeinsam nutzen können. Statisch ist einfacher zu verteilen, dynamisch spart Speicher und erleichtert Updates.

AspektStatisches LinkenDynamisches Linken
ZeitpunktZur Build-Zeit: Der Bibliothekscode wird in die ausführbare Datei kopiertBeim Laden oder zur Laufzeit: Ein dynamischer Linker findet gemeinsam genutzte Bibliotheken (.so, .dll) und bindet sie ein
Größe der ausführbaren DateiGrößerKleiner
SpeicherbedarfJedes Programm trägt seine eigene Kopie des BibliothekscodesEine Kopie einer Shared Library kann von vielen Prozessen gemeinsam genutzt werden
Updates und SicherheitsfixesDas Programm muss neu gebaut und neu verteilt werdenDie Bibliothek wird einmal aktualisiert; Programme profitieren ohne Neubau (sofern die Schnittstelle kompatibel bleibt)
StartzeitEtwas schnellerEtwas langsamer: Symbole müssen aufgelöst werden (oft lazy)
DeploymentEigenständig: läuft, ohne dass die Bibliotheken installiert sein müssenBenötigt die richtigen Bibliotheksversionen auf dem Zielsystem, sonst startet das Programm nicht
LaufzeitkostenErmöglicht Whole-Program-Optimierung und direkte AufrufeGeringer Mehraufwand durch indirekte Aufrufe über GOT und PLT
VersionsproblemeKeine zur LaufzeitMögliche Unstimmigkeiten zwischen Programm und installierter Bibliothek
Typische EinsatzgebieteEmbedded-Firmware, Einzeldatei-Tools, minimale ContainerDie meisten Programme auf Allzweck-Betriebssystemen, Plug-ins, Systembibliotheken wie libc

Die Zahlenangaben sind typische Größenordnungen und variieren je nach Prozessgeneration und Produkt.

Wann welches einsetzen

Statisch
Wenn Sie eine eigenständige Binärdatei wollen, die überall läuft, oder wenn es keinen Loader des Betriebssystems gibt, wie bei Embedded-Firmware.
Dynamisch
Wenn viele Programme dieselben Bibliotheken nutzen und Sie Speicher sparen und Bibliotheken zentral patchen wollen.

FAQ

Warum schlägt mein Programm mit einer Fehlermeldung zu einer fehlenden Bibliothek fehl?

Es wurde dynamisch gelinkt, und die benötigte Shared Library (eine .so- oder .dll-Datei) ist auf diesem Computer nicht installiert. Installieren Sie die Bibliothek oder linken Sie das Programm statisch.

Spart dynamisches Linken Speicher?

Ja. Eine Kopie einer Shared Library im RAM kann von vielen Prozessen gemeinsam genutzt werden.

Ist statisches Linken schneller?

Etwas. Es vermeidet die Symbolauflösung beim Start und die indirekten Aufrufe über GOT und PLT und ermöglicht Whole-Program-Optimierung.

Warum hilft dynamisches Linken bei Sicherheitsupdates?

Eine Shared Library kann einmal gepatcht werden, und jedes Programm, das sie verwendet, profitiert davon, ohne neu gebaut zu werden.

Wichtige Begriffe erklärt

Statisches Linken
Linken, bei dem der Code der verwendeten Bibliotheken in die ausführbare Datei kopiert wird. Sie läuft ohne vorhandene Bibliotheken, ist aber größer, und Korrekturen an Bibliotheken erfordern ein Neubauen.
Dynamisches Linken
Linken, bei dem gemeinsame Bibliotheken zur Laufzeit geladen und gebunden werden. Bibliotheken können von Prozessen geteilt und durch Austausch repariert werden, doch auf dem System muss eine kompatible Bibliothek vorhanden sein.
Gemeinsame Bibliothek (Shared Library)
Eine Bibliothek, die durch dynamisches Linken zur Laufzeit geladen wird: .so unter Linux, .dll unter Windows. Sie wird als positionsunabhängiger Code gebaut, so dass ihre Codeseiten von vielen Prozessen geteilt werden können.
Statische Bibliothek
Ein Archiv, das viele Objektdateien bündelt (.a unter Linux). Beim statischen Linken zieht der Linker nur die benötigten Objekte in die ausführbare Datei.

Weitere Vergleiche