ID: Q193462
The information in this article applies to:
- Microsoft Windows NT 4.0
- Microsoft Windows 95
- Microsoft Windows 98
An attempt to load a statically-linked CRT-dependent DLL when all 64 of the TLS slots are already in use fails with the following error code:
1114 -- ERROR_DLL_INIT_FAILED.
A process can only map 64 (or less) statically-linked C run-time (CRT)
dependent DLLs. A statically-linked CRT-dependent DLL is one in which the
CRT library is fully compiled into the DLL.
The CRT library makes use of thread-local storage (TLS). Each time a statically-linked CRT-dependent DLL is mapped into a process, the CRT is initialized. During this initialization, a TLS slot is allocated. There are only TLS_MINIMUM_AVAILABLE slots available to each process. This constant is guaranteed to be at least 64 on all Win32 platforms.
If you have code-control over the DLLs, dynamically link them with the CRT library. This provides access to all of the CRT functions, without building them directly into the executable. The DLL version of the CRT is only initialized once per process.
Using the Microsoft Visual C++ compiler, you can dynamically link your project with the CRT library by compiling it as a Multithreaded DLL. You can do this by including the /MD compiler switch.
If no CRT functions are used within a DLL, you can include the linker switches /NODEFAULTLIB and /ENTRY:DllMain to bypass the CRT initialization code.
This behavior is by design.
For additional information, please see the following article in the Microsoft Knowledge Base:
ARTICLE-ID: Q94248
TITLE : HOWTO: Use the C Run-Time
ARTICLE-ID: Q94804
TITLE : INFO: Thread Local Storage Overview
Additional query words:
Keywords : kbDLL kbKernBase kbThread
Issue type : kbprb
Last Reviewed: October 2, 1998