mirror of
https://github.com/reactos/reactos.git
synced 2025-01-05 22:12:46 +00:00
[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:
parent
63d0bb53e4
commit
dec26d7804
3 changed files with 30 additions and 3 deletions
|
@ -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()
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
11
reactos/lib/sdk/crt/startup/mscdllmain.c
Normal file
11
reactos/lib/sdk/crt/startup/mscdllmain.c
Normal 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;
|
||||
}
|
Loading…
Reference in a new issue