* 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.
This commit is contained in:
		
							parent
							
								
									7a84e9c4bc
								
							
						
					
					
						commit
						3ab591cf71
					
				|  | @ -1,3 +1,9 @@ | |||
| 2014-10-10  Corinna Vinschen  <corinna@vinschen.de> | ||||
| 
 | ||||
| 	* 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  <corinna@vinschen.de> | ||||
| 
 | ||||
| 	* fhandler_procsys.cc (fhandler_procsys::readdir): Just test | ||||
|  |  | |||
|  | @ -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; | ||||
|  |  | |||
|  | @ -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 (); | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue