PRB: Volání LoadLibrary() načtení knihovny DLL, která má statické TLS

Příznaky

Dynamická knihovna (DLL) pomocí __declspec(thread) přidělit statické místního úložného prostoru vlákna (TLS). Nebyly zaznamenány žádné problémy spojené s spuštění aplikace, která je propojena s odpovídající statické knihovny. Avšak pokud aplikace používá funkce LoadLibrary načíst DLL namísto použití statické verze, LoadLibrary selže v Win32s s kódem chyby 87: Neplatný parametr.

Funkce LoadLibrary úspěšně v počítači se systémem Windows 98, Windows NT nebo Windows 2000 v této situaci. Volání funkce v knihovně DLL, které odkazují na proměnné statické TLS chování však není definován. V systému Microsoft Windows 95 Funkce LoadLibrary selže a GetLastError funkce vrátí 1114 - ERROR_DLL_INIT_FAILED (dynamické propojení knihovny inicializační rutiny se nezdařilo). Funkce LoadLibrary úspěšně v systému Windows 2000. Jakýkoli pokus o přístup k datům TLS však způsobuje narušení přístupu (AV).

Příčina

Jedná se o omezení Funkce LoadLibrary a __declspec. V době běhu je přidělen prostor globální proměnné pro vlákno. Velikost je založena na výpočtu požadavků aplikace spolu s požadavky všech knihoven, které jsou staticky propojeny. Pokud knihovnu DLL používá TLS statické a dynamické propojena v aplikaci, při volání Funkce LoadLibrary nebo FreeLibrary , musí systém najít všechny podprocesy, které existují v procesu a zvětšit nebo komprimovat jejich TLS paměti podle velikosti statické TLS v nově načíst DLL. Tento proces je příliš mnoho pro operační systémy pro správu, které může způsobit výjimku při je dynamicky načtené knihovny DLL, nebo kód odkazy data.

Řešení

Knihovny DLL, které pomocí __declspec(podproces) by neměla být načtena s LoadLibrary.


Použití těchto funkcí TLS jako TlsAlloca přidělit TLS knihovny DLL může být načtena s LoadLibrary, je třeba změnit kód knihovny DLL. Nebo DLL, která používá __declspec(thread) je implicitně načíst pouze do aplikace.

Další informace

Chcete-li zjistit, zda knihovna DLL používá TLS statické, lze použít nástroj Dumpbin.exe vypsat informace záhlaví. Knihovna DLL má statické TLS, pokud obsahuje VOLITELNÉ HODNOTY ZÁHLAVÍ velikost, která je větší než 0 (nula) v adresáři úložiště vlákno následujícím způsobem:

[18] RVA 517B20 [velikost] podprocesů úložiště adresáře
Vlastnosti

ID článku: 118816 - Poslední kontrola: 10. 1. 2017 - Revize: 1

Váš názor