Hi,
I don't agree with these changes.
If we need a DllEntry in the lib, then we should use the one that is
provided by mingw-w64 (all this code is 100% mingw-w64). It simply
returns true (thats exactly what the one in MS CRT does) and works for
gcc and MSVC.
Also what's the point of DisableThreadLibraryCalls() here? As you wrote
yourself, no DllMain only means "I have nothing more to initialize than
the CRT". But this disables the CRT thread initializion, too.
There is also no need for weak symbols, we can simply call the stub
DllMain, since it doesn't (shouldn't) do anything.
Regards,
Timo
Am 27.08.2012 01:31, schrieb jgardou(a)svn.reactos.org:
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