2002-10-07 Roland McGrath <roland@redhat.com>
authorroland <roland>
Fri, 11 Oct 2002 10:51:43 +0000 (10:51 +0000)
committerroland <roland>
Fri, 11 Oct 2002 10:51:43 +0000 (10:51 +0000)
* sysdeps/generic/dl-sysdep.h: New file.
* sysdeps/mach/hurd/dl-sysdep.h: New file.
* sysdeps/generic/ldsodefs.h: Include <dl-sysdep.h>.
* include/errno.h [IS_IN_rtld]: Include <dl-sysdep.h> to define ...
[RTLD_PRIVATE_ERRNO]: Use a hidden global variable for errno and
access it directly.
* elf/dl-minimal.c (__errno_location): Removed.
* sysdeps/unix/i386/sysdep.S (__syscall_errno) [RTLD_PRIVATE_ERRNO]:
Use GOTOFF access for errno.
* sysdeps/unix/sysv/linux/i386/sysdep.h
[RTLD_PRIVATE_ERRNO] (SYSCALL_ERROR_HANDLER): Likewise.
* include/tls.h: New file.
(USE___THREAD): New macro.
Define to 1 under [USE_TLS && HAVE___THREAD] and only when compiling
libc or libpthread.
* sysdeps/unix/sysv/linux/i386/sysdep.h [USE___THREAD]: Conditional
changed from [USE_TLS && HAVE___THREAD].
* sysdeps/unix/sysv/linux/x86_64/sysdep.h: Likewise.
* sysdeps/unix/i386/sysdep.S: Likewise.
* sysdeps/unix/x86_64/sysdep.S: Likewise.
* include/errno.h: Likewise.
* include/netdb.h: Likewise.
* include/resolv.h: Likewise.

include/errno.h
sysdeps/unix/i386/sysdep.S

index e9add91..eed947f 100644 (file)
@@ -4,16 +4,34 @@
 
 #if defined _ERRNO_H && !defined _ISOMAC
 
-# include <tls.h>              /* Defines USE_TLS.  */
+# ifdef IS_IN_rtld
+#  include <dl-sysdep.h>
+# endif
+
+# if RTLD_PRIVATE_ERRNO
+/* The dynamic linker uses its own private errno variable.
+   All access to errno inside the dynamic linker is serialized,
+   so a single (hidden) global variable is all it needs.  */
 
-# if USE_TLS && HAVE___THREAD && (!defined NOT_IN_libc || defined IS_IN_rtld)
 #  undef  errno
 #  define errno errno          /* For #ifndef errno tests.  */
-extern __thread int errno;
+extern int errno attribute_hidden;
 #  define __set_errno(val) (errno = (val))
+
 # else
-#  define __set_errno(val) (*__errno_location ()) = (val)
-# endif
+
+#  include <tls.h>             /* Defines USE_TLS.  */
+
+#  if USE___THREAD
+#   undef  errno
+#   define errno errno         /* For #ifndef errno tests.  */
+extern __thread int errno;
+#   define __set_errno(val) (errno = (val))
+#  else
+#   define __set_errno(val) (*__errno_location ()) = (val)
+#  endif
+
+# endif        /* RTLD_PRIVATE_ERRNO */
 
 #endif /* _ERRNO_H */
 
index 2948658..dceb681 100644 (file)
 #include <bp-asm.h>
 #include <bp-sym.h>
 
+#ifdef IS_IN_rtld
+# include <dl-sysdep.h>                /* Defines RTLD_PRIVATE_ERRNO.  */
+#endif
+
 .globl C_SYMBOL_NAME(errno)
 .globl syscall_error
 
@@ -42,7 +46,7 @@ syscall_error:
 notb:
 #endif
 #ifndef        PIC
-# if USE_TLS && HAVE___THREAD
+# if USE___THREAD
        movl %eax, %gs:C_SYMBOL_NAME(errno@NTPOFF)
 # elif !defined _LIBC_REENTRANT
        movl %eax, C_SYMBOL_NAME(errno)
@@ -57,12 +61,17 @@ notb:
 #else
        /* The caller has pushed %ebx and then set it up to
           point to the GOT before calling us through the PLT.  */
-# if USE_TLS && HAVE___THREAD
+# if USE___THREAD
        movl C_SYMBOL_NAME(errno@GOTNTPOFF)(%ebx), %ecx
 
        /* Pop %ebx value saved before jumping here.  */
        popl %ebx
        movl %eax, %gs:0(%ecx)
+# elif RTLD_PRIVATE_ERRNO
+       movl %eax, C_SYMBOL_NAME(errno@GOTOFF)(%ebx)
+
+       /* Pop %ebx value saved before jumping here.  */
+       popl %ebx
 # elif !defined _LIBC_REENTRANT
        movl C_SYMBOL_NAME(errno@GOT)(%ebx), %ecx