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:
parent
0e2e3c958c
commit
4de8596b8e
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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__
|
||||||
|
|
Loading…
Reference in New Issue