Fix __getreent function for Cygwin

So far the lib function __getreent always returned _impure_ptr.  On Cygwin
this is only correct after _impure_ptr got initialized.  The inline
function in include/cygwin/config.h always returns the right _reent ptr,
though.

After introducing per-thread locales, the __getreent function is called
prior to initialization of _impure_ptr (from dll_crt0_0) to access the
locale pointer, which leads to a crash.

Fix the __getreent lib function for Cygwin to return the correct _reent
pointer all the time.  Rename inline function to __inline_getreent
and introduce a macro __getreent calling the inline function.  Change
the lib function __getreent to call __inline_getreent on Cygwin.

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
Corinna Vinschen 2016-08-18 10:27:14 +02:00
parent 0e2e3c958c
commit 4de8596b8e
2 changed files with 8 additions and 2 deletions

View File

@ -1,5 +1,4 @@
/* default reentrant pointer when multithread enabled */ /* default reentrant pointer when multithread enabled */
#include <_ansi.h> #include <_ansi.h>
#include <reent.h> #include <reent.h>
@ -10,5 +9,11 @@
struct _reent * struct _reent *
_DEFUN_VOID(__getreent) _DEFUN_VOID(__getreent)
{ {
#ifdef __CYGWIN__
/* Utilize Cygwin's inline definition from include/cygwin/config.h
(note the extra underscore) */
return __inline_getreent ();
#else
return _impure_ptr; return _impure_ptr;
#endif
} }

View File

@ -42,7 +42,7 @@ extern "C" {
#include "../tlsoffsets.h" #include "../tlsoffsets.h"
#endif #endif
__attribute__((gnu_inline)) __attribute__((gnu_inline))
extern inline struct _reent *__getreent (void) extern inline struct _reent *__inline_getreent (void)
{ {
register char *ret; register char *ret;
#ifdef __x86_64__ #ifdef __x86_64__
@ -52,6 +52,7 @@ extern inline struct _reent *__getreent (void)
#endif #endif
return (struct _reent *) (ret + tls_local_clib); return (struct _reent *) (ret + tls_local_clib);
} }
#define __getreent() __inline_getreent()
#endif /* _COMPILING_NEWLIB */ #endif /* _COMPILING_NEWLIB */
#ifdef __x86_64__ #ifdef __x86_64__