Linker (Computerprogramm)

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche
Bibliotheken (lib) und/oder Objektdateien (obj) werden vom Linker zu Bibliotheken, Dynamischen Bibliotheken (dll) oder ausführbaren Dateien (exe) zusammengefügt (gelinkt).

Unter einem Linker oder Binder (auch: „Bindelader“) versteht man ein Computerprogramm, das einzelne Programmmodule zu einem ausführbaren Programm zusammenstellt (verbindet). Auf IBM-Großrechnersystemen wird der Linker linkage editor (englisch) genannt.[1]

Die meisten Programme enthalten Bestandteile oder Module, die in anderen Programmen Verwendung finden können. Mehrere kompilierte Module mit Funktionen (so genannte Objektdateien) können zu Funktionsbibliotheken (Programmbibliotheken) zusammengefasst werden. Der Code wird durch den Linker zum Hauptprogramm hinzugefügt, falls die entsprechende Funktion benötigt wird.

Um ein Programmmodul in einem anderen Programm verwenden zu können, müssen die symbolischen Adressen der Funktionen und Variablen des Moduls in Speicheradressen umgewandelt werden. Diese Aufgabe übernimmt der Linker. Der Linkvorgang erfolgt nach der Kompilierung und ist meistens der letzte Arbeitsschritt zur Erstellung eines Programms. Man unterscheidet generell zwischen statischem und dynamischem Linken.

Statisches Linken[Bearbeiten]

Das statische Linken ist der Vorgang, der typischerweise am Ende der Entwicklung des Programms erfolgt. Das Ergebnis ist ein fertig zusammengesetztes Programm. Dieses besteht bei vollständig statisch gelinkten Programmen aus einer einzigen Datei. Beim statischen Linken wird die Programmmoduleauflösung der Anwendung zum Entwicklungszeitpunkt einmalig durchgeführt, im Gegensatz zum dynamischen Linken bei dem dies jedes Mal zur Laufzeit geschieht. Ein Vorteil ist beim statischen Linken eine erhöhte Portabilität einer Anwendung, da diese nicht auf die Bereitstellung von Programmmodulen z. B. durch das Betriebssystem angewiesen ist, da die Anwendung diese selbst mitführt. Eine Installation des Programms ist somit nicht erforderlich.[2] Nachteile sind ein potentiell höherer Speicherbedarf, da Programmmodule nicht von anderen Programmen mitverwendet werden können, als auch die Notwendigkeit die Gesamtanwendung neu zu kompilieren und zu linken falls für ein Teilmodul eine verbesserte Version herausgegeben wurde.[3]

Wegen dieser Nachteile unterstützen einige C-Bibliotheken unter Unix-artigen Betriebssystemen das statische Linken oft nicht mehr vollständig.[3] So erzwingt beispielsweise die glibc ein dynamisches Linken bei Modulen, die die Benutzerauthentifizierung betreffen. Programme, die diese Module verwenden, sind immer auf die Anwesenheit einer passenden „Laufzeitversion“ der glibc angewiesen.

Dynamisches Linken[Bearbeiten]

Es ist auch möglich, das Auflösen der Funktions- und Variablennamen zu verschieben, bis das Programm tatsächlich ausgeführt wird. In diesem Fall spricht man von dynamischen Bibliotheken (bzw. je nach Betriebssystem von dynamically linked library (DLL) oder shared library). Dies hat den Vorteil, dass die Bibliothek nachträglich leicht ausgetauscht werden kann, die Programme kleiner werden, und der Speicher nur einmal benötigt wird, wenn mehrere Programme dieselbe Bibliothek verwenden. Der Nachteil besteht darin, dass sichergestellt werden muss, dass die richtige DLL in der richtigen Version installiert ist (siehe DLL-Konflikt). Zum Teil kann das Linken zur Laufzeit des Programmes erfolgen.

Mischformen der statischen und dynamischen Link-Art sind der Normalfall. Bei solchen Programmdateien findet der Linkvorgang praktisch zweimal statt: Einmal durch den Entwickler, und ein zweites Mal – unsichtbar – beim Anwender während der Ausführung. Im Regelfall werden die Namen der benötigten externen Bibliotheken beim ersten Linkvorgang fest einkodiert; es ist aber auch möglich, dass das Programm nach Überprüfung der vorhandenen Bibliotheken während der Laufzeit wahlweise einzelne nachlädt oder auch nicht. Solche nachgeladenen Bibliotheken werden oft als Plug-ins bezeichnet.

Namenskonflikte[Bearbeiten]

Bei dem Vorgang des Linkens entsteht ein einziger großer, nicht-hierarchischer, gemeinsamer Namensraum. Dadurch kommt es bei großen oder sehr verzweigten Projekten oft zu Namenskonflikten. Für diese Fälle sind weak links üblich, bei denen die Linkreihenfolge entscheidet, welches Modul wo verwendet wird. Programmiersprachen wie z. B. C++ lösen das Problem dadurch, dass Modulinhalte über hierarchisch aufgebaute Namen angesprochen werden. Ungelöst bleibt damit jedoch beispielsweise das Problem der Anwesenheit einer Bibliothek in verschiedenen Versionen; das Problem ist zum Zeitpunkt des Linkens nur dadurch lösbar, dass dem Linker je nach benötigter Bibliothek unterschiedliche Suchpfade mitgegeben werden; jede der in Frage kommenden Bibliotheken unterscheidet sich zwar von der Bezeichnung her, ist aber inhaltlich für einen Linker ununterscheidbar, da in ihr die gleichen Symbole vorhanden sind. Nach dem ersten, statischen Linken ist die Angelegenheit dagegen unproblematisch, da sich die verwendete Bibliothek von da an anhand ihres Namens aufrufen lässt.

Siehe auch[Bearbeiten]

Einzelnachweise[Bearbeiten]

  1.  IBM Corporation (Hrsg.): Operating System 360, Linkage Editor, Program Logic Manual. New York 1967.
  2. http://www-vs.informatik.uni-ulm.de/teach/ss10/bs/docs/BS_D1_12_Hauptspeicher.pdf "Betriebssysteme" - Vorlesung im Hauptstudium - Kapitel über Hauptspeicher Folie 6
  3. a b Ulrich Drepper: Static Linking Considered Harmful (englisch) redhat.com. Archiviert vom Original am 2004. Abgerufen am 13. Januar 2012: „There are still too many people out there who think (or even insist) that static linking has benefits. This has never been the case and never will be the case. [...]

Literatur[Bearbeiten]