summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--winsup/cygwin/ChangeLog6
-rw-r--r--winsup/cygwin/autoload.cc8
2 files changed, 12 insertions, 2 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 3e8218771..302fb5ef0 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,5 +1,11 @@
2005-03-02 Christopher Faylor <cgf@timesys.com>
+ * autoload.cc (std_dll_init): Save and restore fpu control register
+ around LoadAddress to prevent loaded dlls (like msvcrt.dll) from
+ setting unwanted stuff.
+
+2005-03-02 Christopher Faylor <cgf@timesys.com>
+
* cygtls.cc (_cygtls::init_thread): Move exitsock setting later. It
2005-03-02 Christopher Faylor <cgf@timesys.com>
diff --git a/winsup/cygwin/autoload.cc b/winsup/cygwin/autoload.cc
index 805b765c1..aef122a2f 100644
--- a/winsup/cygwin/autoload.cc
+++ b/winsup/cygwin/autoload.cc
@@ -208,8 +208,13 @@ std_dll_init ()
while (InterlockedIncrement (&dll->here));
else if (!dll->handle)
{
+ unsigned fpu_control = 0;
+ __asm__ __volatile__ ("fnstcw %0": "=m" (fpu_control));
if ((h = LoadLibrary (dll->name)) != NULL)
- dll->handle = h;
+ {
+ __asm__ __volatile__ ("fldcw %0": : "m" (fpu_control));
+ dll->handle = h;
+ }
else if (!(func->decoration & 1))
api_fatal ("could not load %s, %E", dll->name);
else
@@ -256,7 +261,6 @@ wsock_init ()
if (!wsock_started)
{
- /* Don't use autoload to load WSAStartup to eliminate recursion. */
int (*wsastartup) (int, WSADATA *);
wsastartup = (int (*)(int, WSADATA *))