From 3ab591cf71a5302ead4eaa1eeff9242717cfdcad Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Fri, 10 Oct 2014 15:29:18 +0000 Subject: [PATCH] * dlfcn.cc (dlopen): Disable old 32 bit code on 64 bit. * dcrt0.cc (check_sanity_and_sync): Ditto. * dll_init.cc (dll_dllcrt0_1): Fix typo in comment. --- winsup/cygwin/ChangeLog | 6 ++++++ winsup/cygwin/dcrt0.cc | 2 ++ winsup/cygwin/dlfcn.cc | 4 ++++ winsup/cygwin/dll_init.cc | 2 +- 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index f970d8ab4..ed36c5db0 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,9 @@ +2014-10-10 Corinna Vinschen + + * dlfcn.cc (dlopen): Disable old 32 bit code on 64 bit. + * dcrt0.cc (check_sanity_and_sync): Ditto. + * dll_init.cc (dll_dllcrt0_1): Fix typo in comment. + 2014-10-09 Corinna Vinschen * fhandler_procsys.cc (fhandler_procsys::readdir): Just test diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc index 02c0ad11d..ac741a689 100644 --- a/winsup/cygwin/dcrt0.cc +++ b/winsup/cygwin/dcrt0.cc @@ -393,11 +393,13 @@ check_sanity_and_sync (per_process *p) api_fatal ("cygwin DLL and APP are out of sync -- API version mismatch %u > %u", p->api_major, cygwin_version.api_major); +#ifndef __x86_64__ /* This is a kludge to work around a version of _cygwin_common_crt0 which overwrote the cxx_malloc field with the local DLL copy. Hilarity ensues if the DLL is not loaded while the process is forking. */ __cygwin_user_data.cxx_malloc = &default_cygwin_cxx_malloc; +#endif } child_info NO_COPY *child_proc_info; diff --git a/winsup/cygwin/dlfcn.cc b/winsup/cygwin/dlfcn.cc index c27adf675..6bcdac92d 100644 --- a/winsup/cygwin/dlfcn.cc +++ b/winsup/cygwin/dlfcn.cc @@ -135,6 +135,7 @@ dlopen (const char *name, int flags) if (last_bs && !wcschr (last_bs, L'.')) wcscat (last_bs, L"."); +#ifndef __x86_64__ /* Workaround for broken DLLs built against Cygwin versions 1.7.0-49 up to 1.7.0-57. They override the cxx_malloc pointer in their DLL initialization code even if loaded dynamically. This is a @@ -150,6 +151,7 @@ dlopen (const char *name, int flags) /* Store original cxx_malloc pointer. */ struct per_process_cxx_malloc *tmp_malloc; tmp_malloc = __cygwin_user_data.cxx_malloc; +#endif if (!(flags & RTLD_NOLOAD) || (ret = GetModuleHandleW (path)) != NULL) @@ -160,8 +162,10 @@ dlopen (const char *name, int flags) (HMODULE *) &ret); } +#ifndef __x86_64__ /* Restore original cxx_malloc pointer. */ __cygwin_user_data.cxx_malloc = tmp_malloc; +#endif if (!ret) __seterrno (); diff --git a/winsup/cygwin/dll_init.cc b/winsup/cygwin/dll_init.cc index 3fcb448b9..51ef186a3 100644 --- a/winsup/cygwin/dll_init.cc +++ b/winsup/cygwin/dll_init.cc @@ -640,7 +640,7 @@ dll_dllcrt0_1 (VOID *x) when loaded either statically or dynamically. Because this leaves a stale pointer into demapped memory space if the DLL is unloaded by a call to dlclose, we prevent this happening for dynamically - loaded DLLS in dlopen by saving and restoring cxx_malloc around + loaded DLLs in dlopen by saving and restoring cxx_malloc around the call to LoadLibrary, which invokes the DLL's startup sequence. Modern DLLs won't even attempt to override the pointer when loaded statically, but will write their overrides directly into the