[Patch] Updating cygwin_dll_init()
Max Kaehn
slothman@electric-cloud.com
Tue May 30 21:12:00 GMT 2006
The recent change (on 2006-05-24) to _dll_crt0() calls dll_crt0_1()
via _cygtls::call() instead of calling it directly. The call in
_cygtls::call2() to ExitThread() means that anyone using
cygwin_dll_init() will find that their main thread suddenly exits
instead of returning control to the caller of cygwin_dll_init().
This fix unrolls _dll_crt0 into cygwin_dll_init() and leaves it up
to the caller of cygwin_dll_init() to provide a pointer to the
padding.
ChangeLog for winsup/cygwin:
2006-05-30 Max Kaehn <slothman@electric-cloud.com>
* dcrt0.cc (cygwin_dll_init): unroll _dll_crt0() into the
function and call _cygtls::init_thread() and dll_crt0_1()
directly, to avoid the ExitThread() call in _cygtls::call2().
ChangeLog for winsup/testsuite:
2006-05-30 Max Kaehn <slothman@electric-cloud.com>
* winsup.api/cygload.h:
* winsup.api/cygload.cc: Add get() method for a pointer
to the padding data, and pass that pointer to
cygwin_dll_init().
2006-05-24 Max Kaehn <slothman@electric-cloud.com>
* winsup.api/cygload.h: Increase padding size to
16384 bytes.
Index: winsup/cygwin/dcrt0.cc
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/dcrt0.cc,v
retrieving revision 1.307
diff -u -p -r1.307 dcrt0.cc
--- winsup/cygwin/dcrt0.cc 28 May 2006 15:50:13 -0000 1.307
+++ winsup/cygwin/dcrt0.cc 30 May 2006 19:54:17 -0000
@@ -984,10 +984,10 @@ dll_crt0 (per_process *uptr)
unload cygwin1.dll, as it is used for _my_tls. It is best to load
cygwin1.dll before spawning any additional threads in your process.
- See winsup/testsuite/cygload for an example of how to use cygwin1.dll
- from MSVC and non-cygwin MinGW applications. */
+ See winsup/testsuite/winsup.api/cygload for an example of how to use
+ cygwin1.dll from MSVC and non-cygwin MinGW applications. */
extern "C" void
-cygwin_dll_init ()
+cygwin_dll_init (void *padding)
{
static char **envp;
static int _fmode;
@@ -997,7 +997,20 @@ cygwin_dll_init ()
user_data->envptr = &envp;
user_data->fmode_ptr = &_fmode;
- _dll_crt0 ();
+ if (padding == NULL) {
+ /* Don't break code from 1.5.18 and 1.5.19. */
+ padding = &_my_tls;
+ }
+
+ /* Everything from this point onward needs to mirror _dll_crt0(), but must
+ * call dll_crt0_1() directly.
+ */
+ main_environ = user_data->envptr;
+ __sinit (_impure_ptr);
+
+ _main_tls = &_my_tls;
+ _main_tls->init_thread(padding, NULL);
+ dll_crt0_1(NULL, padding);
}
extern "C" void
Index: winsup/testsuite/winsup.api/cygload.cc
===================================================================
RCS file: /cvs/src/src/winsup/testsuite/winsup.api/cygload.cc,v
retrieving revision 1.1
diff -u -p -r1.1 cygload.cc
--- winsup/testsuite/winsup.api/cygload.cc 2 Jan 2006 06:15:58 -0000 1.1
+++ winsup/testsuite/winsup.api/cygload.cc 30 May 2006 19:54:18 -0000
@@ -126,6 +126,12 @@ cygwin::padding::check ()
<< ". Stack variables could be overwritten!" << endl;
}
+void *
+cygwin::padding::get()
+{
+ return _main->_padding;
+}
+
cygwin::connector::connector (const char *dll)
{
// This will throw if padding is not in place.
@@ -145,9 +151,9 @@ cygwin::connector::connector (const char
// * spawn the cygwin signal handling thread from sigproc_init()
// * initialize the thread-local storage for this thread and overwrite
// the first 4K of the stack
- void (*cyginit) ();
+ void (*cyginit) (void *);
get_symbol ("cygwin_dll_init", cyginit);
- (*cyginit) ();
+ (*cyginit) (cygwin::padding::get());
*out << "Loading symbols..." << endl;
Index: winsup/testsuite/winsup.api/cygload.h
===================================================================
RCS file: /cvs/src/src/winsup/testsuite/winsup.api/cygload.h,v
retrieving revision 1.1
diff -u -p -r1.1 cygload.h
--- winsup/testsuite/winsup.api/cygload.h 2 Jan 2006 06:15:58 -0000 1.1
+++ winsup/testsuite/winsup.api/cygload.h 30 May 2006 19:54:18 -0000
@@ -59,14 +59,17 @@ namespace cygwin
// Verifies that padding has been declared.
static void check ();
+ static void *get ();
+
private:
std::vector< char > _backup;
char *_stackbase, *_end;
- // gdb reports sizeof(_cygtls) == 3964 at the time of this writing.
+ // gdb reports sizeof(_cygtls) == 4212 at the time of this writing,
+ // and CYGTLS_PADSIZE = 3 * sizeof(_cygtls).
// This is at the end of the object so it'll be toward the bottom
// of the stack when it gets declared.
- char _padding[8192];
+ char _padding[16384];
static padding *_main;
static DWORD _mainTID;
More information about the Cygwin-patches
mailing list