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/mscdll…
==============================================================================
--- 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