* lib/atexit.c (atexit): Check for being linked into the executable.

If so, call __cxa_atexit with NULL DSO handle.  Explain why.
	* lib/dso_handle.c: New file providing fallback __dso_handle.
This commit is contained in:
Corinna Vinschen 2014-11-05 16:26:18 +00:00
parent b8fd41f5df
commit e5e6b6c49f
3 changed files with 30 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2014-11-05 Corinna Vinschen <corinna@vinschen.de>
* lib/atexit.c (atexit): Check for being linked into the executable.
If so, call __cxa_atexit with NULL DSO handle. Explain why.
* lib/dso_handle.c: New file providing fallback __dso_handle.
2014-11-05 Corinna Vinschen <corinna@vinschen.de>
* Makefile.in (NEW_FUNCTIONS): Add atexit to be not exported.

View File

@ -9,6 +9,7 @@ Cygwin license. Please consult the file "CYGWIN_LICENSE" for
details. */
#include <stddef.h>
#include <windows.h>
/* Statically linked replacement for the former cygwin_atexit. We need
the function here to be able to access the correct __dso_handle of the
@ -18,6 +19,16 @@ atexit (void (*fn) (void))
{
extern int __cxa_atexit(void (*)(void*), void*, void*);
extern void *__dso_handle;
extern void *__ImageBase;
return __cxa_atexit ((void (*)(void*))fn, NULL, &__dso_handle);
/* Check for being called from inside the executable. If so, use NULL
as __dso_handle. This allows to link executables with GCC versions
not providing __dso_handle in crtbegin{S}.o. In this case our own
__dso_handle defined in lib/dso_handle.c is used. However, our
__dso_handle always points to &__ImageBase, while the __dso_handle
for executables provided by crtbegin.o usually points to NULL.
That's what we remodel here. */
return __cxa_atexit ((void (*)(void*))fn, NULL,
&__ImageBase == (void **) GetModuleHandleW (NULL)
? NULL : &__dso_handle);
}

View File

@ -0,0 +1,12 @@
/* dso_handle.c: Provide default __dso_handle.
Copyright 2014 Red Hat, Inc.
This file is part of Cygwin.
This software is a copyrighted work licensed under the terms of the
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
details. */
extern void *__ImageBase;
void *__dso_handle = &__ImageBase;