2 Einleitung

Einzelne wiederverwendbare Programmteile werden auf allen gängigen Systemen in Funktionsbibliotheken ausgelagert, wenn sie eine gewisse Allgemeingültigkeit haben und ausgetestet sind.

Beispielsweise die Standardfunktionen jeder Programmiersprache werden nicht mit jedem Programm mit kompiliert, sondern vorher einmalig in einer Bibliothek abgelegt und zu jedem Programm nur gelinkt.

Die ursprüngliche Vorgehensweise ist das sogenannte statische Linken: Zu jedem Programm werden zumindest die Teile der Bibliotheken hinzugefügt, die von dem jeweiligen Programm verwendet werden.

Dies führt aber zu einer immensen Redundanz: Wenn auf einem Unixsystem 98% aller Programme in C geschrieben sind, und fast alle die Funktionen printf() und strcpy() (neben vielen anderen) benötigen, dann sind diese Funktionen in mehrtausendfacher Kopie auf jedem Rechner vorhanden. Es wird aber nicht nur Plattenplatz verschwendet, sondern auch Speicherplatz zur Laufzeit: die mehrfach vorhandenen Funktionen der gleichzeitig im Speicher befindlichen Prozesse sind eigentlich überflüssig, weil sie stückweise identische Information, nämlich gleichen Maschinencode, enthalten. Solange die Programme den Maschinencode nicht verändern (was die meisten Systeme ohnehin unterbinden) reicht es, wenn der gemeinsam genutzte Maschinencode (ebenso wie konstanter Speicher) nur einmal im physikalischen Speicher vorliegt, und in den virtuellen Adreßraum aller Prozesse eingeblendet wird, die den Code benötigen.

Dazu wurden (zuerst für Multitaskingmaschinen wie VMS, Unix etc.) Konzepte zur mehrfachen Verwendung von Bibliotheken entworfen: das dynamische Linken.

In der Unix-Welt heißen solche Bibliotheken shared objects, abgekürzt so. Unter Windows heißt das Gegenstück dynamic link library oder DLL.

Das unter Linux praktizierte Vorgehen wurde von Solaris entlehnt und ist typisch für moderne Unixversionen. Unter Windows wird ein sehr ähnlicher Mechanismus bereitgestellt, der natürlich für alle Dinge ganz unterschiedliche Namen einführt; schließlich wurde das Konzept ja von Microsoft neu erfunden.

Abgesehen von etlichen Unterschieden im praktischen Betrieb (siehe Wie eine dynamische Bibliothek gefunden wird und Versionen einer dynamischen Bibliothek) und einer willkürlich anderen Namensgebung ist die Verwendung unter Windows einerseits und Linux/Unix andererseits sehr ähnlich.

Die Beispiele werden für Linux anhand von g++ (getestet mit Kernelversion 2.4.0 und g++ Version 2.95.2) und für Windows (W2000, Visual C++ 6.0) vorgestellt.

Auf anderen Unix-Systemen gibt es mehr oder weniger ähnliche Mechanismen, die hier nicht behandelt werden (wer braucht noch Unix, seit es Linux gibt?).



Unterabschnitte
www.wachtler.de