Author: jgardou Date: Sun Aug 26 23:31:49 2012 New Revision: 57171
URL: http://svn.reactos.org/svn/reactos?rev=57171&view=rev Log: [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".
Added: trunk/reactos/lib/sdk/crt/startup/mscdllmain.c (with props) Modified: trunk/reactos/lib/sdk/crt/msvcrtex.cmake trunk/reactos/lib/sdk/crt/startup/crtdll.c
Modified: trunk/reactos/lib/sdk/crt/msvcrtex.cmake URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/sdk/crt/msvcrtex.cmake?... ============================================================================== --- trunk/reactos/lib/sdk/crt/msvcrtex.cmake [iso-8859-1] (original) +++ trunk/reactos/lib/sdk/crt/msvcrtex.cmake [iso-8859-1] Sun Aug 26 23:31:49 2012 @@ -66,7 +66,9 @@ 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()
Modified: trunk/reactos/lib/sdk/crt/startup/crtdll.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/sdk/crt/startup/crtdll.... ============================================================================== --- trunk/reactos/lib/sdk/crt/startup/crtdll.c [iso-8859-1] (original) +++ trunk/reactos/lib/sdk/crt/startup/crtdll.c [iso-8859-1] Sun Aug 26 23:31:49 2012 @@ -50,7 +50,19 @@
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 @@ } 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); }
Added: trunk/reactos/lib/sdk/crt/startup/mscdllmain.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/sdk/crt/startup/mscdllm... ============================================================================== --- trunk/reactos/lib/sdk/crt/startup/mscdllmain.c (added) +++ trunk/reactos/lib/sdk/crt/startup/mscdllmain.c [iso-8859-1] Sun Aug 26 23:31:49 2012 @@ -1,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; +}
Propchange: trunk/reactos/lib/sdk/crt/startup/mscdllmain.c ------------------------------------------------------------------------------ svn:eol-style = native