diff options
Diffstat (limited to 'libc/misc/internals')
| -rw-r--r-- | libc/misc/internals/__errno_location.c | 10 | ||||
| -rw-r--r-- | libc/misc/internals/errno.c | 21 |
2 files changed, 29 insertions, 2 deletions
diff --git a/libc/misc/internals/__errno_location.c b/libc/misc/internals/__errno_location.c index 10b97753f..c0b1532b9 100644 --- a/libc/misc/internals/__errno_location.c +++ b/libc/misc/internals/__errno_location.c @@ -1,7 +1,15 @@ #include <errno.h> + +#ifndef __UCLIBC_HAS_THREADS_NATIVE__ #undef errno +extern int errno; +#endif -int * weak_const_function __errno_location (void) +int * +#ifndef __UCLIBC_HAS_THREADS_NATIVE__ +weak_const_function +#endif +__errno_location (void) { return &errno; } diff --git a/libc/misc/internals/errno.c b/libc/misc/internals/errno.c index f2424eae0..107b61403 100644 --- a/libc/misc/internals/errno.c +++ b/libc/misc/internals/errno.c @@ -1,6 +1,24 @@ #include <features.h> -#undef errno +#ifdef __UCLIBC_HAS_THREADS_NATIVE__ +__thread int errno; +__thread int h_errno; + +#ifdef SHARED +/* + * FIXME: Add usage of hidden attribute for both of these when used in + * the shared library. It currently crashes the linker when doing + * section relocations. + */ +extern __thread int __libc_errno __attribute__ ((alias ("errno"))); +extern __thread int __libc_h_errno __attribute__ ((alias ("h_errno"))); +#else +extern __thread int __libc_errno __attribute__ ((alias ("errno"))); +extern __thread int __libc_h_errno __attribute__ ((alias ("h_errno"))); +#endif +#define h_errno __libc_h_errno + +#else extern int errno; extern int h_errno; @@ -15,3 +33,4 @@ int _h_errno = 0; weak_alias (_errno, errno) weak_alias(_h_errno, h_errno); +#endif |
