PRB: LoadLibrary() zum Laden einer DLL, welche einen statischen TLS besitzt, aufrufen

Problembeschreibung

Eine Dynamic Link Library (DLL) verwendet __declspec(Thread), um statischen lokalen Threadspeicher (TLS) zu reservieren. Es gibt keine Probleme mit der entsprechenden statischen Bibliothek mit einer Anwendung verknüpft ist. Jedoch, wenn eine Anwendung die LoadLibrary-Funktion verwendet, um eine DLL zu laden, anstatt der statischen Version, führt LoadLibrary auf Win32-Systemen zum Fehlercode 87: Ungültiger Parameter.

LoadLibrary erfolgreich auf einem Computer mit Windows 98, Windows NT oder Windows 2000 in diesem Fall ist. Allerdings ist das Verhalten Aufrufen von Funktionen in der DLL, die statische TLS-Variablen verweisen nicht definiert. Unter Microsoft Windows 95-Funktion LoadLibrary fehlschlägt und GetLastError gibt 1114 - ERROR_DLL_INIT_FAILED (eine dynamische Initialisierungsroutine ist fehlgeschlagen). Windows 2000 erfolgreich die LoadLibrary -Funktion. TLS-Daten zuzugreifen versucht verursacht jedoch eine Verletzung (AV).

Ursache

Dies ist eine Einschränkung des LoadLibrary und __declspec. Die globale Variable für einen Thread wird zur Laufzeit zugeordnet. Die Größe basiert auf den Erfordernissen der Anwendung sowie alle statisch verknüpften Bibliotheken an. Eine DLL verwendet statische TLS und Dynamic Link in einer Anwendung bei LoadLibrary und FreeLibrary aufgerufen wird, muss das System alle Threads finden, die im Prozess vorhanden und vergrößern oder deren TLS Speicher je nach statischen TLS neu geladenen DLL komprimieren. Dabei ist zu groß für Betriebssysteme verwalten, die eine Ausnahme auslösen kann, oder wenn die DLL dynamisch geladen wird code Verweise Daten.

Problemlösung

DLLs, die mit __declspec(Thread) sollten nicht mit LoadLibrarygeladen werden.


DLL-Code muss geändert werden, verwenden Sie TLS Funktionen wie TlsAllocund TLS zuweisen, wenn die DLL mit LoadLibrarygeladen wird. Oder die DLL, die mit __declspec(Thread) sollte in der Anwendung nur implizit geladen.

Weitere Informationen

Um festzustellen, ob eine DLL statische TLS verwendet, Dumpbin.exe Tool lässt sich die Headerinformationen speichern. Eine DLL hat statische TLS enthält OPTIONAL HEADER VALUES eine Größe, die größer als 0 (null) in das Speicherverzeichnis Thread wie folgt:

517B20 [18] RVA [Größe] der Speicherverzeichnis Thread
Eigenschaften

Artikelnummer: 118816 – Letzte Überarbeitung: 10.01.2017 – Revision: 1

Feedback