Warum benötigt die implizite DLL-Verknüpfung die relevante Lib-Datei, aber die explizite Verknüpfung nicht?

8

In einer Windows-Umgebung

Als ich versuchte, eine DLL mit meinem Programm Explicitly (unter Verwendung von LoadLibrary) zu verknüpfen,

  • Zuerst muss ich die Funktionszeiger entsprechend definieren Funktionssignatur innerhalb der DLL.
  • Dann holen Sie sich die Funktionsadressen mit 'GetProcAddress' und weisen Sie sie diesen Zeigern zu.

Als ich versuchte, die DLL mit meinem Programm Implizit (mit Header-Datei) zu verknüpfen

  • Zuerst braucht es die relevante Header-Datei, um Funktionssignaturen zu erhalten.
  • Dann benötigt es die relevante Lib -Datei, die mit der DLL erzeugt wurde.

    Meine Fragen sind

    1. Warum benötigt die implizite Verknüpfung auch eine Lib -Datei?
    2. Welche Informationen müssen aus der 'Lib'-Datei abgerufen werden, die nicht von DLL oder Header file ?
    3. abgerufen werden kann?
    4. Wenn es für Frage 2 etwas gibt, wie werden Informationen beim expliziten Laden abgerufen?

Ich bin schon durch diese Frage. Aber ich kann keinen würdigen Grund verstehen. Bitte, könnte jemand helfen, dies in einfachen Worten zu erklären. Danke.

    
Nayana Adassuriya 24.07.2013, 04:32
quelle

2 Antworten

3
  

Warum implizit eine Link-Lib-Datei benötigt.

Die .libs enthalten die Importinformationen der DLL. Sie können die Informationen mit dem Befehl dumpbin überprüfen, der in Windows / Visual Studio SDK enthalten ist.

Dies ist die Link-Information von recv in ws2_32.lib zum Beispiel:

%Vor%

Sie können überprüfen, ob es die Ordinalzahl und den Namen in ws2_32.dll gibt (prüfen Sie, ob es jetzt heißt, eine DLL zu importieren).

  

Welche Informationen benötigt man aus 'Lib' Datei, die nicht aus DLL oder Header-Datei

erhalten kann

In der Header-Datei gibt es keine Informationen darüber, wo die Importe extrahiert werden. Daher werden sie beim Kompilieren als Importe (__imp__name) markiert. Wenn sie mit der .lib verknüpft sind, wird der Name aufgelöst:

  • Wenn es in der .lib ist, verlinkt es nur darauf.
  • Aber wenn Informationen zur externen Referenz (DLL) vorhanden sind, wird der Import in der Importtabelle erstellt, so dass er dynamisch geladen wird.
  

Wenn es Frage 2 gibt, wie diese Informationen beim expliziten Laden abgerufen werden.

Wenn Sie zum expliziten Laden die LoadLibrary meinen, sagen Sie dies zur Laufzeit und nicht zur Verbindungszeit. Der PE-Lader wird also die DLL im PATH suchen und dynamisch laden. Dann haben Sie andere Funktionen, um die Adressen der exportierten Funktionen zu erhalten.

Wenn du etwas nicht verstehst, frage mich einfach, versuche mit Dumpbin zu spielen und lese über PE, wenn du das besser verstehen willst.

    
snf 24.07.2013 04:58
quelle
1

Bei der impliziten Verknüpfung gibt die Funktionsdeklaration den im Programm zu verwendenden Namen sowie den Prototyp und die Aufrufkonvention an. Aber mehr Informationen werden benötigt. Speziell:

  1. Die Tatsache, dass die Funktion extern in einer DLL implementiert ist.
  2. Der Name dieser DLL.
  3. Der exportierte Name der Funktion. Das ist der Name, der zum Exportieren der Funktion aus der DLL verwendet wird, die nicht mit der beim Importieren identisch ist.

Einige Sprachdesigner haben diese Informationen mithilfe von Spracherweiterungen bereitgestellt. Zum Beispiel hat Delphi diesen Weg genommen. Implizites Verknüpfen wird vollständig in Code ohne LIB-Dateien angegeben. Auf der anderen Seite besteht die Konvention für C und C ++ darin, .lib-Dateien zu verwenden, um die fehlenden Informationen anzugeben.

    
David Heffernan 13.08.2014 07:15
quelle

Tags und Links