[MINGWEX]

- mark DllMain as a weak symbol for GCC.
- supply a stubbed DllMain for MSVC.
- DllMain is optional, and some DLLs don't implement it. That doesn't mean that they have no entry point, it means "I have nothing more to initialize than the CRT".

svn path=/trunk/; revision=57171
This commit is contained in:
Jérôme Gardou 2012-08-26 23:31:49 +00:00
parent 63d0bb53e4
commit dec26d7804
3 changed files with 30 additions and 3 deletions

View file

@ -66,7 +66,9 @@ elseif(ARCH MATCHES amd64)
endif()
if(MSVC)
list(APPEND MSVCRTEX_SOURCE startup/mscmain.c)
list(APPEND MSVCRTEX_SOURCE
startup/mscmain.c
startup/mscdllmain.c)
else()
list(APPEND MSVCRTEX_SOURCE startup/gccmain.c)
endif()

View file

@ -50,7 +50,19 @@ extern _PVFV *__onexitend;
extern int mingw_app_type;
/*
* It is possible that a DLL provides no DllMain entry point.
* Mark it as a weak symbol for GCC.
* Tests show that at link time, MSVC looks for a function first in the object files provided, and then
* in the libraries. This means that we must provide a basic implementation in msvcrtex, which will be used
* if none is found in the object files provided to link.exe.
* This also means that we can't rely on a DllMain function implemented in a static library when linking a DLL.
*/
#ifdef __GNUC__
extern WINBOOL WINAPI DllMain (HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved) __attribute__((weak));
#else
extern WINBOOL WINAPI DllMain (HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved);
#endif
extern WINBOOL WINAPI DllEntryPoint (HANDLE, DWORD, LPVOID);
@ -198,10 +210,12 @@ __DllMainCRTStartup (HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved)
}
if (dwReason == DLL_PROCESS_ATTACH)
__main ();
retcode = DllMain(hDllHandle,dwReason,lpreserved);
if(DllMain)
retcode = DllMain(hDllHandle,dwReason,lpreserved);
if (dwReason == DLL_PROCESS_ATTACH && ! retcode)
{
DllMain (hDllHandle, DLL_PROCESS_DETACH, lpreserved);
if(DllMain)
DllMain (hDllHandle, DLL_PROCESS_DETACH, lpreserved);
DllEntryPoint (hDllHandle, DLL_PROCESS_DETACH, lpreserved);
_CRT_INIT (hDllHandle, DLL_PROCESS_DETACH, lpreserved);
}

View file

@ -0,0 +1,11 @@
#include <oscalls.h>
#define _DECL_DLLMAIN
#include <process.h>
WINBOOL WINAPI DllMain (HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved)
{
/* If the DLL provides no DllMain, then chances are that it doesn't bother with thread initialization */
if(dwReason == DLL_PROCESS_ATTACH)
DisableThreadLibraryCalls(hDllHandle);
return TRUE;
}