2010-01-13 6 views

Antwort

17

Load-Time-Verknüpfung ist, wenn Symbole in der Bibliothek, auf die von der ausführbaren Datei (oder einer anderen Bibliothek) verwiesen wird, beim Laden der ausführbaren Datei in den Speicher vom Betriebssystem verarbeitet werden.

Laufzeitverknüpfung ist, wenn Sie eine vom Betriebssystem bereitgestellte API oder eine Bibliothek verwenden, um eine DLL oder ein DSO bei Bedarf zu laden und dann die Symbolauflösung durchzuführen.

Ich weiß mehr über Linux DSOs als Windows DLLs, aber das Prinzip sollte das gleiche sein. .NET-Bibliotheken können sich unterscheiden.

In Linux werden Plugin-Architekturen auf diese Weise erstellt. Ihr Programm wird Runtime-Linking verwenden, um eine Bibliothek zu laden und einige Funktionen aufzurufen. Dann vielleicht entladen. Es ermöglicht auch das Laden mehrerer Bibliotheken mit den gleichen Symbolen, die geladen werden, ohne zu kollidieren. Ich denke, DLLs werden auf die gleiche Weise funktionieren.

Ausführbare Dateien haben "Leerzeichen" in ihren Symboltabellen, die von einer Bibliothek gefüllt werden müssen. Diese Leerzeichen werden normalerweise zur Ladezeit oder zur Kompilierzeit ausgefüllt. Sie können die Notwendigkeit von "Leerzeichen" in der Symboltabelle durch Verwenden der Laufzeitverknüpfung negieren.

Ein anderes Szenario, in dem die Laufzeitverknüpfung nützlich ist, ist das Debuggen von Bibliotheken oder das Auswählen aus mehreren ABI/API-kompatiblen Bibliotheken zur Laufzeit. Ich habe oft eine Bibliothek, sagen "foo" und eine "foo_unstable" und eine Test-App, die zwischen den 2 und einigen Tests wechselt.

unter Linux, um zu sehen, was zu einer ausführbaren Links Bibliotheken während der Ladezeit Sie den ldd Befehl ausführen und Ausgabe erhalten, wie (auf/bin/ls):

linux-vdso.so.1 => (0x00007fff139ff000) 
librt.so.1 => /lib64/librt.so.1 (0x0000003c4f200000) 
libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003c4fa00000) 
libcap.so.2 => /lib64/libcap.so.2 (0x0000003c53a00000) 
libacl.so.1 => /lib64/libacl.so.1 (0x0000003c58e0000 

Das Betriebssystem wird versuchen, lade die Bibliotheken (die .so-Dateien) zur Ladezeit. Möglicherweise befindet sich die Bibliothek bereits im Speicher.

14

Aiden Glocke bedeckt die Grundlagen, aber ich will hinzufügen:

Ladezeit dynamische Verknüpfung in der Regel durch statische Verknüpfung Ihrer Anwendung auf eine .lib oder .a-Datei, die den Code für die automatische Festlegung der Laufzeit enthält erfolgt Links zu Symbolen in .dll oder .so Dateien beim Programmstart gefunden werden. Dies ist normalerweise für feste Funktionalität (d. H. Die C-Laufzeitbibliothek usw.) und ermöglicht es Ihrem Programm, die Vorteile von Fehlerkorrekturen in den Bibliotheken zu nutzen, während die Größe der ausführbaren Dateien klein gehalten wird (indem gängiger Code in eine einzige Bibliothek einbezogen wird).

Die Laufzeitverknüpfung wird für dynamischere Funktionen wie das Laden von Plugins verwendet. Wie Aiden sagte, verwenden Sie LoadLibrary() oder das Äquivalent, um Module zur Laufzeit aktiv an Ihr Programm anzuhängen, vielleicht indem Sie ein Verzeichnis mit Plugin-DLLs abfragen, jedes einzelne laden und mit einer selbst entwickelten Plugin-API darüber sprechen. Auf diese Weise kann Ihr Programm Module laden, die beim Kompilieren/Verknüpfen Ihrer App nicht vorhanden waren und somit nach der Bereitstellung organisch wachsen können.

Im Grunde rufen beide Methoden die API LoadLibrary() auf, verwenden aber im ersteren Fall eine feste Menge von Symbolen und Bibliotheken und im letzteren Fall eine dynamischere Menge.

+2

+1 für Entwicklung/Wachstum Vorteile. Modulare Architektur ist cool. –

+2

Zusätzliche Informationen für ausführbare .Net-Dateien: Sie verwenden dynamische Laufzeitverknüpfungen. Wenn Sie .NET-DLLs in "Dependency Walker" öffnen, können Sie sehen, dass sie nur dynamische Ladezeitverbindung mit MSCOREE.DLL laden. Weitere Informationen dazu finden Sie hier: http://stackoverflow.com/questions/9545603/is-mscorlib-dll-mscoree-dll-loaded-whenn-net-application-runs Wenn Sie verweisen, aber keine DLL und die verwenden DLL fehlt, dann wird Ihre App keinen Fehler machen. Sie können die aktuell geladenen DLLs unter Debug> Windows> Module anzeigen. –

9

Es ist lange her, seit die Frage gestellt wurde. Und die Antworten von Aiden und Drew deckten den größten Teil der Essenz ab.Ich möchte nur ein paar Dinge aus der Perspektive eines Programmierers hinzufügen.

Wenn Sie Load-Time Dynamic Linking verwenden, müssen wir eine Verknüpfung zur LIB-Datei herstellen. Und dann können wir die Methode im Code so explizit wie üblich aufrufen. (Siehe Using Load-Time Dynamic Linking für das Codebeispiel)

Wenn Sie dynamische Laufzeitverknüpfung verwenden, müssen Sie das Laden/Freigeben der DLL verwalten und die Funktion selbst durchsuchen. (Für das Codebeispiel siehe Using Run-Time Dynamic Linking)

Für eine Auswahl zwischen den 2 Optionen, überprüfen Sie Determining Which Linking Method to Use.

Also, ich denke, die Load-Time Dynamic Linking ist nur eine andere Möglichkeit, Programmierer Aufwand zu sparen. Aber es kommt um den Preis einiger Erweiterbarkeit. Sie können nur die DLL verwenden, die den LIB-Dateien entspricht, die Sie als Importbibliothek verwenden.

Grundsätzlich verwenden beide Verknüpfungsansätze die LoadLibrary() API auf Windows-Plattform.

0

In der Ladezeit dynamische Verknüpfung ist ausführbare Datei mit der DLL-Bibliothek verknüpft, während in der Laufzeit dynamische Verknüpfung keine ausführbare Datei wurde verknüpft mit einem DLL.

Laufzeit dynamische Verknüpfung ist vorzuziehen, wenn die Startleistung der Anwendung wichtig ist