|
Dynamic Link Library (DLL) bezeichnet allgemein eine Dynamische Bibliothek, meist bezieht sich der Begriff jedoch auf die unter dem Betriebssystem Microsoft Windows verwendete Variante.
Windows-DLL-Dateien verwenden das auch für ausführbare Windows-Programme gebräuchliche EXE-Dateiformat. Sowohl EXE- als auch DLL-Dateien können Programmcode (Maschinencode), Daten und Ressourcen in irgendeiner Kombination enthalten.
Die Windows-Dateiendung für solche Bibliotheken ist gewöhnlich DLL, OCX (für Bibliotheken mit ActiveX Steuerelementen) oder ICL (für Bibliotheken, die nur Gerätebilder, sogenannte Icons, enthalten). Hintergrund Hauptartikel: Programmbibliothek Der Zweck von DLL-Dateien ist, den von einer Anwendung auf der Festplatte und im Hauptspeicher benötigten Speicherplatz zu reduzieren. Jeglicher Programmcode, der von mehr als einer Anwendung benötigt werden könnte, wird deshalb in einer einzelnen Datei auf der Festplatte gespeichert und nur einmal in den Hauptspeicher geladen, wenn mehrere Programme dieselbe Programmbibliothek benötigten.
Weitere Vorteile Wird ein Stück Programmcode verbessert, müssen nicht alle Programme geändert werden, die diesen Code nutzen, sondern es genügt, ihn in der DLL zu aktualisieren. Alle Programme können in diesem Fall auf die aktualisierte Fassung zugreifen. Dadurch ist es Softwareentwicklern möglich, relativ kleine Patches für größere Softwarepakete herauszugeben, beispielsweise auch für ganze Betriebssysteme. Ein ganzes Paket kann so durch die Aktualisierung einzelner DLLs auf den neuesten Stand gebracht werden.
In Form von Plug-ins können mit DLLs neue Programmteile für ein bereits bestehendes Programm erstellt und darin nahtlos integriert werden, ohne dass am schon existierenden Programm Veränderungen vorgenommen werden müssten. Diese Idee der dynamischen „Einbindbarkeit“ wird zum Beispiel unter Windows durch ActiveX realisiert.
Auch können durch solch einen modularen Aufbau einfach nicht benötigte Funktionen deaktiviert werden.
Schwächen Ein in der Windows-Welt auch DLL Hell genanntes Problem tritt auf, wenn mehrere Anwendungen verschiedene Versionen der gleichen DLL benötigen. Falls einem Programm die erforderliche Version fehlt, kann das zu Problemen, wie fehlerhaften Installationen, führen. Dieser Konflikt kann oft behoben werden, indem die jeweils richtige Version der Programmbibliothek in den Programmordner des jeweiligen Programms kopiert wird. Der Effekt der Speicherersparnis wird dadurch allerdings wieder zunichte gemacht. Viele Betriebssysteme und unter Windows Microsoft .NET umgehen Probleme mit Versionskonflikten bei DLL-Dateien, indem sie die gleichzeitige Existenz von mehreren Versionen einer Programmbibliothek ermöglichen. Bei heutigen Computern mit ausreichend Arbeits- und Festplattenspeicher ist dies ein sinnvoller Weg, um der „DLL Hell“ vorzubeugen.
Betriebssysteminterne Behandlung
Laden von DLLs bei einem Programmstart
Wenn ein Programm ausgeführt werden soll, dann wird es vom Loader des Betriebssystems in den Speicher geladen und die Import-Table des Programms ausgelesen. In dieser Tabelle befinden sich alle DLL-Befehls-Namen oder die Ordnungszahlen der DLL-Befehle, die von diesem Programm benötigt werden. Der Loader lädt nun die fehlenden DLLs in den Speicher und fügt in der Import-Table des Programms die Einsprungadressen der einzelnen Befehle ein.
DLL-Datei Aufbau
Eine DLL hat denselben PE-Header wie eine normale ausführbare Datei, nur ist im Characteristics-Wert das IMAGE_FILE_DLL-Bit gesetzt. Während sowohl DLLs als auch ausführbare Dateien eine Export-Table besitzen können, wird dies bei letzteren selten benutzt. In dieser "Export-Table" sind alle Namen der Funktionen und Variablen aufgelistet, die die DLL an externe Benutzer zur Verfügung stellt. Diese Namen müssen alphabetisch sortiert sein, damit der Loader sie finden kann.
Aufruf eines DLL-Befehles durch ein Programm [Bearbeiten]Zuerst werden die zu übergebenden Werte auf dem Stack abgelegt, dann wird ein indirekter Sprung auf den Wert der vom Loader in der Import-Tabelle hinterlegten DLL-Adresse durchgeführt.
DLLs im Speicher
Es gibt zwei verschiedene Arten, wie DLLs vom Betriebssystem in den Speicher geladen werden. Es gibt statische DLLs, die nur einmal geladen werden. Alle Programme greifen dann auf diese eine Instanz der DLL zu. Diese DLL hat dann nur einen globalen Speicherbereich. Die Windows-Kernel-DLLs sind solche statischen DLLs, was ihnen erlaubt, das gesamte System zu verwalten (z. B. alle offenen Dateien zu überwachen). Die andere Art, wie eine DLL im Speicher verwaltet werden kann, ist die, dass jedes mal wenn ein neues Programm sie benötigt, auch eine neue Instanz von ihr in den Speicher geladen wird. Ob eine DLL statisch oder nicht ist legt ein weiteres Flag im Header der DLL fest.
DLL-Instanzenzähler
Jedes Mal, wenn eine DLL von einem Programm geladen wird, wird ein interner Instanzenzähler für diese DLL erhöht. Über diesen Zähler kann das System erkennen, ob eine DLL noch in Verwendung ist oder entladen werden kann. Letzteres geschieht, wenn der Instanzenzähler Null erreicht, da das letzte laufende Programm, welches die DLL benutzt hat, die DLL entladen hat und diese nicht weiter im Speicher vorgehalten werden muss.
Kommentare () |
 |
|
|
|
|