GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Verwenden (statisch gelinkte) DLLs einen anderen Heap als das Hauptprogramm?

Lassen Sie uns zunächst die Heap-Zuweisung und den Stack auf dem Windows-Betriebssystem in Bezug auf unsere Anwendungen/DLLs verstehen. Traditionell werden das Betriebssystem und die Laufzeitbibliotheken mit einer Implementierung des Heaps geliefert.

  1. Zu Beginn eines Prozesses erstellt das Betriebssystem einen Standard-Heap namens Prozess-Heap. Der Process-Heap wird zum Zuweisen von Blöcken verwendet, wenn kein anderer Heap verwendet wird.
  2. Sprachlaufzeiten können auch separate Heaps innerhalb eines Prozesses erzeugen. (Zum Beispiel erstellt die C-Laufzeit einen eigenen Heap.)
  3. Neben diesen dedizierten Heaps kann das Anwendungsprogramm oder eine der vielen geladenen Dynamic Link Libraries (DLLs) separate Heaps erstellen und verwenden, die als private Heaps bezeichnet werden
  4. Dieser Heap sitzt in allen virtuellen Speichersystemen auf dem Virtual Memory Manager des Betriebssystems.
  5. Lassen Sie uns mehr über CRT und zugehörige Haufen diskutieren:
    1. C/C++ Run-time (CRT) allocator:Stellt malloc() und free() sowie new- und delete-Operatoren bereit.
    2. Die CRT erstellt einen solchen zusätzlichen Heap für alle ihre Zuweisungen (das Handle dieses CRT-Heaps wird intern in der CRT-Bibliothek in einer globalen Variablen namens _crtheap gespeichert) als Teil ihrer Initialisierung.
    3. CRT erstellt seinen eigenen privaten Heap, der sich über dem Windows-Heap befindet.
    4. Der Windows-Heap ist eine dünne Schicht, die den Windows-Laufzeitzuordner (NTDLL) umgibt.
    5. Die Windows-Laufzeitzuweisung interagiert mit der virtuellen Speicherzuweisung, die vom Betriebssystem verwendete Seiten reserviert und festschreibt.

Ihre DLL- und Exe-Links zu statischen Multithread-CRT-Bibliotheken. Jede DLL und Exe, die Sie erstellen, hat einen eigenen Heap, d. h. _crtheap. Die Zuweisungen und Freigaben müssen vom jeweiligen Heap erfolgen. Dass eine dynamisch von der DLL zugewiesene Datei nicht von der ausführbaren Datei aufgehoben werden kann und umgekehrt.

Was du tun kannst? Kompilieren Sie unseren Code in DLLs und EXE-Dateien mit /MD oder /MDd, um die multithreadspezifische und DLL-spezifische Version der Laufzeitbibliothek zu verwenden. Daher sind sowohl DLL als auch exe mit derselben C-Laufzeitbibliothek und damit einem _crtheap verknüpft. Zuweisungen werden immer mit Aufhebungen von Zuweisungen innerhalb eines einzelnen Moduls gepaart.


DLLs/exes müssen mit einer Implementierung von C-Laufzeitbibliotheken verknüpft werden.

Im Fall von C-Windows-Runtime-Bibliotheken haben Sie die Möglichkeit anzugeben, ob Sie auf Folgendes verlinken möchten:

  1. Single-Threaded-C-Laufzeitbibliothek (Unterstützung für Single-Threaded-Bibliotheken wurde jetzt eingestellt)
  2. Multithreaded-DLL / Multithreaded-Debug-DLL
  3. Statische Laufzeitbibliotheken.
  4. Ein paar mehr (Sie können den Link überprüfen)

Jeder von ihnen verweist auf einen anderen Heap, daher dürfen Sie keine Adresse, die Sie von einem Heap einer Laufzeitbibliothek erhalten haben, an eine andere weitergeben.

Jetzt hängt es davon ab, mit welcher C-Laufzeitbibliothek die DLL, von der Sie sprechen, verknüpft wurde. Angenommen, die von Ihnen verwendete DLL wurde mit der statischen C-Laufzeitbibliothek verknüpft und Ihr Anwendungscode (der die Hauptfunktion enthält) mit der Multithread-C-Laufzeit-DLL verknüpft, dann übergeben Sie einen Zeiger auf den in der DLL in Ihr Hauptprogramm kopieren und versuchen, sie dort freizugeben oder umgekehrt, kann dies zu undefiniertem Verhalten führen. Die grundlegende Ursache sind also die C-Laufzeitbibliotheken. Bitte wählen Sie sie sorgfältig aus.

Weitere Informationen zu den unterstützten C-Laufzeitbibliotheken finden Sie hier und hier

Ein Zitat von MSDN:

Achtung Vermischen Sie keine statischen und dynamischen Versionen der Laufzeitbibliotheken. Das Vorhandensein von mehr als einer Kopie der Laufzeitbibliotheken in einem Prozess kann Probleme verursachen, da statische Daten in einer Kopie nicht mit der anderen Kopie geteilt werden. Der Linker verhindert, dass Sie sowohl statische als auch dynamische Versionen innerhalb einer .exe-Datei verknüpfen, aber Sie können immer noch zwei (oder mehr) Kopien der Laufzeitbibliotheken erhalten. Beispielsweise kann eine Dynamic Link Library, die mit den statischen (Nicht-DLL-)Versionen der Laufzeitbibliotheken verknüpft ist, Probleme verursachen, wenn sie mit einer EXE-Datei verwendet wird, die mit der dynamischen (DLL-)Version der Laufzeitbibliotheken verknüpft wurde . (Sie sollten auch vermeiden, die Debug- und Nicht-Debug-Versionen der Bibliotheken in einem Prozess zu mischen.)


Linux
  1. So verwenden Sie den Linux-Grep-Befehl

  2. So verwenden Sie den Verlaufsbefehl unter Linux

  3. CentOS / RHEL :So konfigurieren Sie vsftpd, dass andere Ports als die Standardports 20 und 21 verwendet werden

  4. Verwenden Sie die Standard-Python-Installation anstelle der Anaconda-Installation, wenn Sie vom Terminal aus aufgerufen werden

  5. Was ist die Verwendung von $ # in Bash

So verwenden Sie den Bash-Lesebefehl

So verwenden Sie den Linux-xargs-Befehl

So verwenden Sie den Linux-te-Befehl

So verwenden Sie den obersten Befehl unter Linux

So verwenden Sie den Linux-Ping-Befehl

Verwendung des grep-Befehls unter Linux