]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
* sysdeps/generic/bits/libc-tsd.h [USE___THREAD]: Conditional
authorRoland McGrath <roland@gnu.org>
Fri, 11 Oct 2002 10:52:20 +0000 (10:52 +0000)
committerRoland McGrath <roland@gnu.org>
Fri, 11 Oct 2002 10:52:20 +0000 (10:52 +0000)
changed from [USE_TLS && HAVE___THREAD].

* sysdeps/i386/dl-machine.h (elf_machine_type_class, elf_machine_rel):
Disable TLS relocs if [RTLD_BOOTSTRAP && !USE___THREAD].
* sysdeps/x86_64/dl-machine.h
(elf_machine_type_class, elf_machine_rela): Likewise.
* sysdeps/sh/dl-machine.h (elf_machine_type_class, elf_machine_rela):
Likewise.

* include/link.h (struct link_map): Remove member l_tls_tp_initialized.
* elf/rtld.c (_dl_start_final, dl_main): Don't use it.
(_dl_start): Conditionalize PT_TLS check on [USE___THREAD].

* sysdeps/i386/dl-tls.h (__TLS_GET_ADDR): Use ___tls_get_addr_internal
instead of ___tls_get_addr.
(___tls_get_addr_internal): Add attribute_hidden to decl.

* sysdeps/generic/ldsodefs.h (struct rtld_global): New variable
_dl_error_catch_tsd.
* elf/rtld.c (startup_error_tsd): New function.
(dl_main): Point _dl_error_catch_tsd at that.
* elf/dl-error.c: Don't use libc-tsd.h for DL_ERROR,
use new function pointer instead.
* elf/dl-tsd.c: New file.
* elf/Makefile (routines): Add it.

2002-10-07  Roland McGrath  <roland@redhat.com>

* elf/dl-misc.c (_dl_debug_vdprintf): Use INTERNAL_SYSCALL macro for
writev if it's available.  Otherwise if [RTLD_PRIVATE_ERRNO] then
take _dl_load_lock around calling __writev.

* sysdeps/unix/sysv/linux/i386/sysdep.h (INTERNAL_SYSCALL): New macro.
(INLINE_SYSCALL): Use that.

* 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.

* sysdeps/unix/x86_64/sysdep.S (__syscall_errno) [RTLD_PRIVATE_ERRNO]:
Use PC-relative access for errno.
* sysdeps/unix/sysv/linux/x86_64/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.

* sysdeps/generic/errno.c: New file.
* csu/Makefile (aux): New variable, list errno.
* sysdeps/unix/sysv/linux/i386/sysdep.S (errno, _errno): Remove defns.
* sysdeps/unix/sysv/linux/m68k/sysdep.S: Likewise.
* sysdeps/unix/sysv/linux/x86_64/sysdep.S: Likewise.
* sysdeps/unix/sysv/linux/s390/s390-64/sysdep.S: Likewise.
* sysdeps/unix/sysv/linux/s390/s390-32/sysdep.S: Likewise.
* sysdeps/unix/sysv/linux/arm/sysdep.S: Likewise.
* sysdeps/unix/sysv/linux/cris/sysdep.S: Likewise.
* sysdeps/unix/sysv/linux/hppa/sysdep.c: Likewise.
* sysdeps/unix/sysv/linux/ia64/sysdep.S: Likewise.
* sysdeps/unix/sysv/linux/powerpc/sysdep.c: Likewise.
* sysdeps/unix/sysv/linux/sparc/sysdep.S: Likewise.
* sysdeps/unix/sysv/linux/sh/sysdep.S: Likewise.
* sysdeps/unix/alpha/sysdep.S: Likewise.
* sysdeps/generic/start.c: Likewise.
* sysdeps/unix/start.c: Likewise.
* sysdeps/unix/arm/start.c: Likewise.
* sysdeps/unix/bsd/ultrix4/mips/start.S: Likewise.
* sysdeps/unix/sparc/start.c: Likewise.
* sysdeps/unix/sysv/irix4/start.c: Likewise.
* sysdeps/unix/sysv/linux/mips/sysdep.S: File removed.

* manual/search.texi (Tree Search Function, Hash Search Function):
Mention search.h clearly.

2002-10-05  Roland McGrath  <roland@redhat.com>

* elf/dl-fxstat64.c: File removed.
* elf/dl-xstat64.c: File removed.
* elf/Makefile (rtld-routines): Remove them.
* sysdeps/unix/sysv/linux/xstat64.c: Remove RTLD_STAT64 conditionals.
Instead, use strong_alias instead of versioned_symbol in the
!SHLIB_COMPAT case.
* sysdeps/unix/sysv/linux/fxstat64.c: Likewise.
* sysdeps/unix/sysv/linux/lxstat64.c: Likewise.

* include/shlib-compat.h
(SHLIB_COMPAT): Require that IS_IN_##lib be defined nonzero.
[! NOT_IN_libc] (IS_IN_libc): Define it.
* cppflags-iterator.mk (CPPFLAGS-$(cpp-src)): Use -Dx=1 not just -Dx.
* elf/Makefile (CPPFLAGS-.os): Likewise.

* sunrpc/rpc_main.c (main): Don't declare with noreturn attribute.
Return the status instead of calling exit.

* Makeconfig (CFLAGS): Prepend -std=gnu99.
* Makerules (+make-deps): Use $(CFLAGS) only for .c sources.
Remove superfluous rm command, whose @ plus make bugs hid
all these commands from the make output.

* include/stubs-prologue.h: New file.  Give #error under #ifdef _LIBC.
* Makefile ($(inst_includedir)/gnu/stubs.h): Depend on it.
Use that file's contents instead of literal echo's for the prologue.
* include/features.h: Include <gnu/stubs.h> unconditionally.
* include/gnu/stubs.h: New file.

2002-09-30  Roland McGrath  <roland@redhat.com>

* elf/rtld-Rules: New file.
* elf/Makefile ($(objpfx)librtld.map, $(objpfx)librtld.mk,
$(objpfx)rtld-libc.a): New targets.
(generated): Add them.
(reloc-link): Remove -o $@ from the variable.
($(objpfx)dl-allobjs.os): Add -o $@ after $(reloc-link).
(distribute): Add rtld-Rules.
(CPPFLAGS-.os): Define this instead of CFLAGS-.os.
* Makerules ($(+sysdir_pfx)sysd-rules): Emit rules for rtld-% targets.
(common-mostlyclean, common-clean): Clean up rtld-* files.
* sysdeps/unix/make-syscalls.sh: Add rtld-*.os target name to rules.

59 files changed:
ChangeLog
Makeconfig
bits/libc-tsd.h
cppflags-iterator.mk
csu/Makefile
elf/Makefile
elf/dl-error.c
elf/dl-minimal.c
elf/dl-misc.c
elf/dl-tsd.c [new file with mode: 0644]
elf/rtld-Rules [new file with mode: 0644]
elf/rtld.c
include/errno.h
include/features.h
include/gnu/stubs.h [new file with mode: 0644]
include/link.h
include/netdb.h
include/resolv.h
include/shlib-compat.h
include/stubs-prologue.h [new file with mode: 0644]
include/tls.h [new file with mode: 0644]
manual/search.texi
sunrpc/rpc_main.c
sysdeps/generic/bits/libc-tsd.h
sysdeps/generic/dl-sysdep.h [moved from sysdeps/unix/sysv/linux/mips/sysdep.S with 58% similarity]
sysdeps/generic/errno.c [moved from elf/dl-xstat64.c with 68% similarity]
sysdeps/generic/ldsodefs.h
sysdeps/generic/start.c
sysdeps/i386/dl-machine.h
sysdeps/i386/dl-tls.h
sysdeps/mach/hurd/dl-sysdep.h [moved from elf/dl-fxstat64.c with 71% similarity]
sysdeps/sh/dl-machine.h
sysdeps/unix/alpha/sysdep.S
sysdeps/unix/arm/start.c
sysdeps/unix/bsd/ultrix4/mips/start.S
sysdeps/unix/i386/sysdep.S
sysdeps/unix/make-syscalls.sh
sysdeps/unix/sparc/start.c
sysdeps/unix/start.c
sysdeps/unix/sysv/irix4/start.c
sysdeps/unix/sysv/linux/arm/sysdep.S
sysdeps/unix/sysv/linux/cris/sysdep.S
sysdeps/unix/sysv/linux/fxstat64.c
sysdeps/unix/sysv/linux/hppa/sysdep.c
sysdeps/unix/sysv/linux/i386/sysdep.S
sysdeps/unix/sysv/linux/i386/sysdep.h
sysdeps/unix/sysv/linux/ia64/sysdep.S
sysdeps/unix/sysv/linux/lxstat64.c
sysdeps/unix/sysv/linux/m68k/sysdep.S
sysdeps/unix/sysv/linux/powerpc/sysdep.c
sysdeps/unix/sysv/linux/s390/s390-32/sysdep.S
sysdeps/unix/sysv/linux/s390/s390-64/sysdep.S
sysdeps/unix/sysv/linux/sh/sysdep.S
sysdeps/unix/sysv/linux/sparc/sysdep.S
sysdeps/unix/sysv/linux/x86_64/sysdep.S
sysdeps/unix/sysv/linux/x86_64/sysdep.h
sysdeps/unix/sysv/linux/xstat64.c
sysdeps/unix/x86_64/sysdep.S
sysdeps/x86_64/dl-machine.h

index 7edab2c01122a983260c71b513731218e4b65b4f..3b41b71b465d810b207370683fd2088e453ed66d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,142 @@
+2002-10-09  Roland McGrath  <roland@redhat.com>
+
+       * sysdeps/generic/bits/libc-tsd.h [USE___THREAD]: Conditional
+       changed from [USE_TLS && HAVE___THREAD].
+
+       * sysdeps/i386/dl-machine.h (elf_machine_type_class, elf_machine_rel):
+       Disable TLS relocs if [RTLD_BOOTSTRAP && !USE___THREAD].
+       * sysdeps/x86_64/dl-machine.h
+       (elf_machine_type_class, elf_machine_rela): Likewise.
+       * sysdeps/sh/dl-machine.h (elf_machine_type_class, elf_machine_rela):
+       Likewise.
+
+       * include/link.h (struct link_map): Remove member l_tls_tp_initialized.
+       * elf/rtld.c (_dl_start_final, dl_main): Don't use it.
+       (_dl_start): Conditionalize PT_TLS check on [USE___THREAD].
+
+       * sysdeps/i386/dl-tls.h (__TLS_GET_ADDR): Use ___tls_get_addr_internal
+       instead of ___tls_get_addr.
+       (___tls_get_addr_internal): Add attribute_hidden to decl.
+
+       * sysdeps/generic/ldsodefs.h (struct rtld_global): New variable
+       _dl_error_catch_tsd.
+       * elf/rtld.c (startup_error_tsd): New function.
+       (dl_main): Point _dl_error_catch_tsd at that.
+       * elf/dl-error.c: Don't use libc-tsd.h for DL_ERROR,
+       use new function pointer instead.
+       * elf/dl-tsd.c: New file.
+       * elf/Makefile (routines): Add it.
+
+2002-10-07  Roland McGrath  <roland@redhat.com>
+
+       * elf/dl-misc.c (_dl_debug_vdprintf): Use INTERNAL_SYSCALL macro for
+       writev if it's available.  Otherwise if [RTLD_PRIVATE_ERRNO] then
+       take _dl_load_lock around calling __writev.
+
+       * sysdeps/unix/sysv/linux/i386/sysdep.h (INTERNAL_SYSCALL): New macro.
+       (INLINE_SYSCALL): Use that.
+
+       * 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.
+
+       * sysdeps/unix/x86_64/sysdep.S (__syscall_errno) [RTLD_PRIVATE_ERRNO]:
+       Use PC-relative access for errno.
+       * sysdeps/unix/sysv/linux/x86_64/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.
+
+       * sysdeps/generic/errno.c: New file.
+       * csu/Makefile (aux): New variable, list errno.
+       * sysdeps/unix/sysv/linux/i386/sysdep.S (errno, _errno): Remove defns.
+       * sysdeps/unix/sysv/linux/m68k/sysdep.S: Likewise.
+       * sysdeps/unix/sysv/linux/x86_64/sysdep.S: Likewise.
+       * sysdeps/unix/sysv/linux/s390/s390-64/sysdep.S: Likewise.
+       * sysdeps/unix/sysv/linux/s390/s390-32/sysdep.S: Likewise.
+       * sysdeps/unix/sysv/linux/arm/sysdep.S: Likewise.
+       * sysdeps/unix/sysv/linux/cris/sysdep.S: Likewise.
+       * sysdeps/unix/sysv/linux/hppa/sysdep.c: Likewise.
+       * sysdeps/unix/sysv/linux/ia64/sysdep.S: Likewise.
+       * sysdeps/unix/sysv/linux/powerpc/sysdep.c: Likewise.
+       * sysdeps/unix/sysv/linux/sparc/sysdep.S: Likewise.
+       * sysdeps/unix/sysv/linux/sh/sysdep.S: Likewise.
+       * sysdeps/unix/alpha/sysdep.S: Likewise.
+       * sysdeps/generic/start.c: Likewise.
+       * sysdeps/unix/start.c: Likewise.
+       * sysdeps/unix/arm/start.c: Likewise.
+       * sysdeps/unix/bsd/ultrix4/mips/start.S: Likewise.
+       * sysdeps/unix/sparc/start.c: Likewise.
+       * sysdeps/unix/sysv/irix4/start.c: Likewise.
+       * sysdeps/unix/sysv/linux/mips/sysdep.S: File removed.
+
+       * manual/search.texi (Tree Search Function, Hash Search Function):
+       Mention search.h clearly.
+
+2002-10-05  Roland McGrath  <roland@redhat.com>
+
+       * elf/dl-fxstat64.c: File removed.
+       * elf/dl-xstat64.c: File removed.
+       * elf/Makefile (rtld-routines): Remove them.
+       * sysdeps/unix/sysv/linux/xstat64.c: Remove RTLD_STAT64 conditionals.
+       Instead, use strong_alias instead of versioned_symbol in the
+       !SHLIB_COMPAT case.
+       * sysdeps/unix/sysv/linux/fxstat64.c: Likewise.
+       * sysdeps/unix/sysv/linux/lxstat64.c: Likewise.
+
+       * include/shlib-compat.h
+       (SHLIB_COMPAT): Require that IS_IN_##lib be defined nonzero.
+       [! NOT_IN_libc] (IS_IN_libc): Define it.
+       * cppflags-iterator.mk (CPPFLAGS-$(cpp-src)): Use -Dx=1 not just -Dx.
+       * elf/Makefile (CPPFLAGS-.os): Likewise.
+
+       * sunrpc/rpc_main.c (main): Don't declare with noreturn attribute.
+       Return the status instead of calling exit.
+
+       * Makeconfig (CFLAGS): Prepend -std=gnu99.
+       * Makerules (+make-deps): Use $(CFLAGS) only for .c sources.
+       Remove superfluous rm command, whose @ plus make bugs hid
+       all these commands from the make output.
+
+       * include/stubs-prologue.h: New file.  Give #error under #ifdef _LIBC.
+       * Makefile ($(inst_includedir)/gnu/stubs.h): Depend on it.
+       Use that file's contents instead of literal echo's for the prologue.
+       * include/features.h: Include <gnu/stubs.h> unconditionally.
+       * include/gnu/stubs.h: New file.
+
+2002-09-30  Roland McGrath  <roland@redhat.com>
+
+       * elf/rtld-Rules: New file.
+       * elf/Makefile ($(objpfx)librtld.map, $(objpfx)librtld.mk,
+       $(objpfx)rtld-libc.a): New targets.
+       (generated): Add them.
+       (reloc-link): Remove -o $@ from the variable.
+       ($(objpfx)dl-allobjs.os): Add -o $@ after $(reloc-link).
+       (distribute): Add rtld-Rules.
+       (CPPFLAGS-.os): Define this instead of CFLAGS-.os.
+       * Makerules ($(+sysdir_pfx)sysd-rules): Emit rules for rtld-% targets.
+       (common-mostlyclean, common-clean): Clean up rtld-* files.
+       * sysdeps/unix/make-syscalls.sh: Add rtld-*.os target name to rules.
+
 2002-10-11  Roland McGrath  <roland@redhat.com>
 
        * sysdeps/generic/dl-tls.c (__tls_get_addr): After freeing block in
index 75dcf38e230e6f7587995bfa65d019cea3e68666..dd03ae803e6c8f9a539060132439f6cc210f5150 100644 (file)
@@ -627,11 +627,15 @@ endif     # $(+cflags) == ""
 libio-include = -I$(..)libio
 
 # These are the variables that the implicit compilation rules use.
+# Note that we can't use -std=* in CPPFLAGS, because it overrides
+# the implicit -lang-asm and breaks cpp behavior for .S files--notably
+# it causes cpp to stop predefining __ASSEMBLER__.
 CPPFLAGS = $($(subdir)-CPPFLAGS) $(+includes) $(defines) \
           -include $(..)include/libc-symbols.h $(sysdep-CPPFLAGS) \
           $(CPPFLAGS-$(suffix $@)) $(CPPFLAGS-$(<F)) $(CPPFLAGS-$(@F)) \
           $(CPPFLAGS-$(patsubst %$(suffix $@),%,$(@F)))
-override CFLAGS        = $(filter-out %frame-pointer,$(+cflags)) $(sysdep-CFLAGS) \
+override CFLAGS        = -std=gnu99 \
+                 $(filter-out %frame-pointer,$(+cflags)) $(sysdep-CFLAGS) \
                  $(CFLAGS-$(suffix $@)) $(CFLAGS-$(<F)) $(CFLAGS-$(@F))
 
 # If everything is compiled with -fPIC (implicitly) we must tell this by
index 1954b2033487c3b7a7c0a96d8772d17122dcc1d0..cc2c2c1219e18f5e4fc5baa62d7e9f0c38a0bc19 100644 (file)
@@ -51,7 +51,7 @@
    We don't define an enum for the possible key values, because the KEYs
    translate directly into variables by macro magic.  */
 
-#if USE_TLS && HAVE___THREAD
+#if USE___THREAD
 # define __libc_tsd_define(CLASS, KEY) CLASS __thread void *__libc_tsd_##KEY;
 
 # define __libc_tsd_address(KEY)       (&__libc_tsd_##KEY)
index 790d345a0ac721e6fe55770636d307ababc7ff21..26db7b042eee7e2205c641cd480eaaa15a633c42 100644 (file)
@@ -4,4 +4,4 @@
 cpp-src := $(firstword $(cpp-srcs-left))
 cpp-srcs-left := $(filter-out $(cpp-src),$(cpp-srcs-left))
 
-CPPFLAGS-$(cpp-src) += -DNOT_IN_libc -DIS_IN_$(lib)
+CPPFLAGS-$(cpp-src) += -DNOT_IN_libc=1 -DIS_IN_$(lib)=1
index c0a06e38678d1a7f739a6c77243f8f1ca3c9061e..a71649ed6e3b22b52fbb480f1c30e7433b4ee182 100644 (file)
@@ -28,6 +28,7 @@ subdir := csu
 
 routines = init-first libc-start $(libc-init) sysdep version check_fds \
           libc-tls
+aux     = errno
 elide-routines.os = libc-tls
 csu-dummies = $(filter-out $(start-installed-name),crt1.o Mcrt1.o)
 extra-objs = start.o gmon-start.o \
index 5470728ae7ae76f559619d4d70eb0d3c47a841f3..5fdcec46df2c2a6d127e68885584e047cdb62765 100644 (file)
@@ -23,7 +23,7 @@ subdir                := elf
 headers                = elf.h bits/elfclass.h link.h
 routines       = $(dl-routines) dl-open dl-close dl-support dl-iteratephdr \
                  dl-iteratephdr-static dl-addr enbl-secure dl-profstub \
-                 dl-origin dl-libc dl-sym
+                 dl-origin dl-libc dl-sym dl-tsd
 
 # The core dynamic linking functions are in libc for the static and
 # profiled libraries.
@@ -37,11 +37,11 @@ elide-routines.os = $(all-dl-routines) dl-support enbl-secure \
 
 # ld.so uses those routines, plus some special stuff for being the program
 # interpreter and operating independent of libc.
-rtld-routines  := rtld $(dl-routines) dl-sysdep dl-environ dl-minimal \
-                  dl-xstat64 dl-fxstat64
+rtld-routines  := rtld $(dl-routines) dl-sysdep dl-environ dl-minimal
 all-rtld-routines = $(rtld-routines) $(sysdep-rtld-routines)
 
-distribute     := $(rtld-routines:=.c) dynamic-link.h do-rel.h dl-machine.h \
+distribute     := rtld-Rules \
+                  $(rtld-routines:=.c) dynamic-link.h do-rel.h dl-machine.h \
                   dl-cache.h dl-hash.h soinit.c sofini.c ldd.bash.in \
                   genrtldtbl.awk atomicity.h dl-procinfo.h ldsodefs.h \
                   dl-librecon.h interp.c sln.c dl-dst.h hp-timing.h \
@@ -166,14 +166,49 @@ lib-noranlib: $(objpfx)$(rtld-installed-name) \
 endif
 
 # Command to link into a larger single relocatable object.
-reloc-link = $(LINK.o) -nostdlib -nostartfiles -r -o $@
+reloc-link = $(LINK.o) -nostdlib -nostartfiles -r
 
 $(objpfx)dl-allobjs.os: $(all-rtld-routines:%=$(objpfx)%.os)
-       $(reloc-link) $^
+       $(reloc-link) -o $@ $^
 
 # Link together the dynamic linker into a single relocatable object.
-$(objpfx)librtld.os: $(objpfx)dl-allobjs.os $(common-objpfx)libc_pic.a
-       $(reloc-link) '-Wl,-(' $^ -lgcc '-Wl,-)'
+# First we do a link against libc_pic.a just to get a link map,
+# and discard the object produced by that link.  From the link map
+# we can glean all the libc modules that need to go into the dynamic
+# linker.  Then we do a recursive make that goes into all the subdirs
+# those modules come from and builds special rtld-foo.os versions that
+# are compiled with special flags, and puts these modules into rtld-libc.a
+# for us.  Then we do the real link using rtld-libc.a instead of libc_pic.a.
+
+$(objpfx)librtld.map: $(objpfx)dl-allobjs.os $(common-objpfx)libc_pic.a
+       $(reloc-link) -o $@.o '-Wl,-(' $^ -lgcc '-Wl,-)' -Wl,-Map,$@
+       rm -f $@.o
+
+$(objpfx)librtld.mk: $(objpfx)librtld.map Makefile
+       sed -n 's@^$(common-objpfx)\([^(]*\)(\(.*.os\))$$@\1 \2@p' $< | \
+       while read lib file; do \
+         case $$lib in \
+         libc_pic.a) \
+           fgrep -l /$$file \
+                 $(common-objpfx)stamp.os $(common-objpfx)*/stamp.os | \
+           sed 's@^$(common-objpfx)\([^/]*\)/stamp\.os$$@rtld-\1'" +=$$file@"\
+           ;; \
+         */*.a) \
+           echo rtld-$${lib%%/*} += $$file ;; \
+         *) echo "Wasn't expecting $$lib($$file)" >&2; exit 1 ;; \
+         esac; \
+       done > $@T
+       echo rtld-subdirs = `sed 's/^rtld-\([^ ]*\).*$$/\1/' $@T \
+                            | sort -u` >> $@T
+       mv -f $@T $@
+
+$(objpfx)rtld-libc.a: $(objpfx)librtld.mk FORCE
+       $(MAKE) -f $< -f rtld-Rules
+
+generated += librtld.map librtld.mk rtld-libc.a
+
+$(objpfx)librtld.os: $(objpfx)dl-allobjs.os $(objpfx)rtld-libc.a
+       $(LINK.o) -nostdlib -nostartfiles -r -o $@ '-Wl,-(' $^ -lgcc '-Wl,-)'
 
 $(objpfx)ld.so: $(objpfx)librtld.os $(ld-map)
        @rm -f $@.lds
@@ -209,6 +244,7 @@ $(objpfx)trusted-dirs.st: Makefile $(..)Makeconfig
        $(make-target-directory)
        echo "$(subst :, ,$(default-rpath) $(user-defined-trusted-dirs))"    \
        | $(AWK) -f gen-trusted-dirs.awk > ${@:st=T};
+       echo '#define DL_DST_LIB "$(notdir $(slibdir))"' >> ${@:st=T}
        $(move-if-change) ${@:st=T} ${@:st=h}
        touch $@
 CPPFLAGS-dl-load.c = -I$(objpfx). -I$(csu-objpfx).
@@ -265,7 +301,7 @@ CFLAGS-ldconfig.c = $(SYSCONF-FLAGS) -D'LIBDIR="$(libdir)"' -D'SLIBDIR="$(slibdi
 CFLAGS-dl-cache.c = $(SYSCONF-FLAGS)
 CFLAGS-cache.c = $(SYSCONF-FLAGS)
 
-CFLAGS-.os += $(if $(filter $(@F),$(patsubst %,%.os,$(all-rtld-routines))),-DNOT_IN_libc -DIS_IN_rtld)
+CPPFLAGS-.os += $(if $(filter $(@F),$(patsubst %,%.os,$(all-rtld-routines))),-DNOT_IN_libc=1 -DIS_IN_rtld=1)
 
 test-modules = $(addprefix $(objpfx),$(addsuffix .so,$(strip $(modules-names))))
 generated += $(addsuffix .so,$(strip $(modules-names)))
index 0af8f2f94bf911d2539cb0ef161e12bab6314be9..e8f2f3e208d704aaccfa2a2ec8bb294da430153a 100644 (file)
@@ -23,7 +23,6 @@
 #include <string.h>
 #include <unistd.h>
 #include <ldsodefs.h>
-#include <bits/libc-tsd.h>
 
 /* This structure communicates state between _dl_catch_error and
    _dl_signal_error.  */
@@ -38,11 +37,8 @@ struct catch
    calls can come from `_dl_map_object_deps', `_dlerror_run', or from
    any of the libc functionality which loads dynamic objects (NSS, iconv).
    Therefore we have to be prepared to save the state in thread-local
-   memory.  */
-
-__libc_tsd_define (static, DL_ERROR)
-#define tsd_getspecific()      __libc_tsd_get (DL_ERROR)
-#define tsd_setspecific(data)  __libc_tsd_set (DL_ERROR, (data))
+   memory.  The _dl_error_catch_tsd function pointer is reset by the thread
+   library so that it returns the address of a thread-local variable.  */
 
 
 /* This message we return as a last resort.  We define the string in a
@@ -72,7 +68,7 @@ _dl_signal_error (int errcode, const char *objname, const char *occation,
   if (! errstring)
     errstring = N_("DYNAMIC LINKER BUG!!!");
 
-  lcatch = tsd_getspecific ();
+  lcatch = *((*GL(dl_error_catch_tsd)) ());
   if (objname == NULL)
     objname = "";
   if (lcatch != NULL)
@@ -151,20 +147,21 @@ _dl_catch_error (const char **objname, const char **errstring,
      inefficient.  So we initialize `c' by hand.  */
   c.errstring = NULL;
 
-  old = tsd_getspecific ();
+  void **catchp = (*GL(dl_error_catch_tsd)) ();
+  old = *catchp;
   errcode = setjmp (c.env);
   if (__builtin_expect (errcode, 0) == 0)
     {
-      tsd_setspecific (&c);
+      *catchp = &c;
       (*operate) (args);
-      tsd_setspecific (old);
+      *catchp = old;
       *objname = NULL;
       *errstring = NULL;
       return 0;
     }
 
   /* We get here only if we longjmp'd out of OPERATE.  */
-  tsd_setspecific (old);
+  *catchp = old;
   *objname = c.objname;
   *errstring = c.errstring;
   return errcode == -1 ? 0 : errcode;
@@ -176,18 +173,19 @@ void
 internal_function
 _dl_receive_error (receiver_fct fct, void (*operate) (void *), void *args)
 {
+  void **catchp = (*GL(dl_error_catch_tsd)) ();
   struct catch *old_catch;
   receiver_fct old_receiver;
 
-  old_catch = tsd_getspecific ();
+  old_catch = *catchp;
   old_receiver = receiver;
 
   /* Set the new values.  */
-  tsd_setspecific (NULL);
+  *catchp = NULL;
   receiver = fct;
 
   (*operate) (args);
 
-  tsd_setspecific (old_catch);
+  *catchp = old_catch;
   receiver = old_receiver;
 }
index f4b7e28782f203759009d0c847bbc8d9420879f0..d1619cfb0c5c237e6b73c1bf088c994441cf2ca2 100644 (file)
@@ -353,19 +353,3 @@ strong_alias (__strsep, __strsep_g)
    up to 36.  We don't need this here.  */
 const char INTUSE(_itoa_lower_digits)[16] attribute_hidden
   = "0123456789abcdef";
-
-
-
-#undef errno
-/* The 'errno' in ld.so is not exported.  */
-#if USE_TLS && HAVE___THREAD
-extern __thread int errno attribute_hidden;
-#else
-extern int errno attribute_hidden;
-
-int *
-__errno_location (void)
-{
-  return &errno;
-}
-#endif
index 2d42230afead4a5b3088b60849af8a50964c2535..f80472485deef7bbe3dc343c900e62fff32a4b9d 100644 (file)
@@ -31,6 +31,7 @@
 #include <sys/stat.h>
 #include <sys/uio.h>
 #include <stdio-common/_itoa.h>
+#include <bits/libc-lock.h>
 
 #ifndef MAP_ANON
 /* This is the only dl-sysdep.c function that is actually needed at run-time
@@ -245,7 +246,17 @@ _dl_debug_vdprintf (int fd, int tag_p, const char *fmt, va_list arg)
     }
 
   /* Finally write the result.  */
+#ifdef INTERNAL_SYSCALL
+  INTERNAL_SYSCALL (writev, 3, fd, iov, niov);
+#elif RTLD_PRIVATE_ERRNO
+  /* We have to take this lock just to be sure we don't clobber the private
+     errno when it's being used by another thread that cares about it.  */
+  __libc_lock_lock_recursive (GL(dl_load_lock));
   __writev (fd, iov, niov);
+  __libc_lock_unlock_recursive (GL(dl_load_lock));
+#else
+  __writev (fd, iov, niov);
+#endif
 }
 
 
diff --git a/elf/dl-tsd.c b/elf/dl-tsd.c
new file mode 100644 (file)
index 0000000..aa290a7
--- /dev/null
@@ -0,0 +1,54 @@
+/* Thread-local data used by error handling for runtime dynamic linker.
+   Copyright (C) 2002 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <ldsodefs.h>
+#include <tls.h>
+
+#ifndef SHARED
+
+/* _dl_error_catch_tsd points to this for the single-threaded case.
+   It's reset by the thread library for multithreaded programs
+   if we're not using __thread.  */
+static void ** __attribute__ ((const))
+startup_error_tsd (void)
+{
+#if USE___THREAD
+  static __thread void *data;
+#else
+  static void *data;
+#endif
+  return &data;
+}
+void **(*_dl_error_catch_tsd) (void) __attribute__ ((const))
+     = &startup_error_tsd;
+
+#elif USE___THREAD
+
+/* libpthread sets _dl_error_catch_tsd to point to this function.
+   We define it here instead of in libpthread so that it doesn't
+   need to have a TLS segment of its own just for this one pointer.  */
+
+void ** __attribute__ ((const))
+__libc_dl_error_tsd (void)
+{
+  static __thread void *data;
+  return &data;
+}
+
+#endif
diff --git a/elf/rtld-Rules b/elf/rtld-Rules
new file mode 100644 (file)
index 0000000..03fe25d
--- /dev/null
@@ -0,0 +1,115 @@
+# Subroutine makefile for compiling libc modules linked into dynamic linker.
+
+# Copyright (C) 2002 Free Software Foundation, Inc.
+# This file is part of the GNU C Library.
+
+# The GNU C Library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+
+# The GNU C Library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+
+# You should have received a copy of the GNU Lesser General Public
+# License along with the GNU C Library; if not, write to the Free
+# Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+# 02111-1307 USA.
+
+# This makefile is never used by itself, but only from the rtld-libc.a
+# rule in Makefile, which does make -f librtld.mk -f rtld-Rules.
+# librtld.mk is the generated file containing variable definitions for
+# `rtld-subdirs', a subset of the top-level $(subdirs) list; and for each
+# SUBDIR in $(rtld-subdirs), `rtld-SUBDIR' listing `module.os' file names.
+
+.PHONY: rtld-all
+rtld-all:
+
+# When run from the elf/Makefile to build rtld-libc.a, $(subdir) is elf.
+ifeq ($(subdir),elf)
+
+ifndef rtld-subdirs
+error This is makefile is a subroutine of elf/Makefile not to be used directly
+endif
+
+include ../Makeconfig
+
+rtld-all: $(objpfx)rtld-libc.a
+
+$(objpfx)rtld-libc.a: $(foreach dir,$(rtld-subdirs),\
+                               $(addprefix $(common-objpfx)$(dir)/rtld-,\
+                                           $(rtld-$(dir))))
+       @-rm -f $@T
+       $(AR) cq $@T $^
+       $(RANLIB) $@T
+       mv -f $@T $@
+
+# For each subdirectory, define a pattern rule that makes all of that
+# subdirectory's modules at once with one recursive make command.
+object-suffixes-left := $(rtld-subdirs)
+define o-iterator-doit
+$(foreach obj,$(rtld-$o),$(common-objpfx)%/rtld-$(obj)): FORCE ; \
+       +$$(rtld-subdir-make)
+endef
+include $(patsubst %,../o-iterator.mk,$(object-suffixes-left))
+
+# This is how we descend into each subdirectory.  See below.
+define rtld-subdir-make
+$(MAKE) -C ../$* objdir=$(objdir) -f Makefile -f ../elf/rtld-Rules rtld-all \
+       rtld-modules='$(addprefix rtld-,$(rtld-$*))'
+endef
+
+FORCE:
+
+else
+
+# In this case we are being run by $(rtld-subdir-make), above.
+# Some other subdir's Makefile has provided all its normal rules,
+# and we just provide some additional definitions.
+
+# These are the basic compilation rules corresponding to the Makerules ones.
+# The sysd-rules generated makefile already defines pattern rules for rtld-%
+# targets built from sysdeps source files.
+$(objpfx)rtld-%.os: %.S $(before-compile); $(compile-command.S)
+$(objpfx)rtld-%.d: %.S $(before-compile); $(+make-deps)
+$(objpfx)rtld-%.os: %.s $(before-compile); $(compile-command.s)
+$(objpfx)rtld-%.d: %.s $(before-compile); $(+make-deps)
+$(objpfx)rtld-%.os: %.c $(before-compile); $(compile-command.c)
+$(objpfx)rtld-%.d: %.c $(before-compile); $(+make-deps)
+
+# The rules for generated source files.
+$(objpfx)rtld-%.os: $(objpfx)%.S $(before-compile); $(compile-command.S)
+$(objpfx)rtld-%.d: $(objpfx)%.S $(before-compile); $(+make-deps)
+$(objpfx)rtld-%.os: $(objpfx)%.s $(before-compile); $(compile-command.s)
+$(objpfx)rtld-%.d: $(objpfx)%.s $(before-compile); $(+make-deps)
+$(objpfx)rtld-%.os: $(objpfx)%.c $(before-compile); $(compile-command.c)
+$(objpfx)rtld-%.d: $(objpfx)%.c $(before-compile); $(+make-deps)
+
+# The command line setting of rtld-modules (see above) tells us
+# what we need to build, and that tells us what dependency files we need.
+rtld-all: $(addprefix $(objpfx),$(rtld-modules))
+
+# Figure out the dependency files we need.  After respecting the $(omit-deps)
+# list as applied to the names without the `rtld-', there may be none left.
+rtld-depfiles := $(patsubst %,$(objpfx)rtld-%.d,\
+                           $(filter-out $(omit-deps),\
+                                        $(rtld-modules:rtld-%.os=%)))
+ifdef rtld-depfiles
+-include $(rtld-depfiles)
+endif
+
+# Just in case we wind up e.g. regenerating dependencies for non-rtld objects,
+# we don't unconditionally modify the flags.  For rtld-% targets, use the
+# special flags set below.
+CFLAGS   += $(if $(filter rtld-%,$(@F)),$(CFLAGS-rtld))
+CPPFLAGS += $(if $(filter rtld-%,$(@F)),$(CPPFLAGS-rtld))
+
+
+# This here is the whole point of all the shenanigans.
+CPPFLAGS-rtld := -DNOT_IN_libc=1 -DIS_IN_rtld=1
+CFLAGS-rtld := # blah
+
+
+endif
index 19600644fb98eb0b4c4586015d5e536a7152b4e1..3a64ca74f7763c32cba5695168d649cfee00ec1f 100644 (file)
@@ -221,21 +221,18 @@ _dl_start_final (void *arg, struct dl_start_final_info *info)
   GL(dl_rtld_map).l_map_end = (ElfW(Addr)) _end;
   /* Copy the TLS related data if necessary.  */
 #if USE_TLS && !defined DONT_USE_BOOTSTRAP_MAP
-# ifdef HAVE___THREAD
+# if USE___THREAD
   assert (info->l.l_tls_modid != 0);
+  GL(dl_rtld_map).l_tls_blocksize = info->l.l_tls_blocksize;
+  GL(dl_rtld_map).l_tls_align = info->l.l_tls_align;
+  GL(dl_rtld_map).l_tls_initimage_size = info->l.l_tls_initimage_size;
+  GL(dl_rtld_map).l_tls_initimage = info->l.l_tls_initimage;
+  GL(dl_rtld_map).l_tls_offset = info->l.l_tls_offset;
+  GL(dl_rtld_map).l_tls_modid = 1;
 # else
-  if (info->l.l_tls_modid != 0)
+  assert (info->l.l_tls_modid == 0);
 # endif
-    {
-      GL(dl_rtld_map).l_tls_blocksize = info->l.l_tls_blocksize;
-      GL(dl_rtld_map).l_tls_align = info->l.l_tls_align;
-      GL(dl_rtld_map).l_tls_initimage_size = info->l.l_tls_initimage_size;
-      GL(dl_rtld_map).l_tls_initimage = info->l.l_tls_initimage;
-      GL(dl_rtld_map).l_tls_offset = info->l.l_tls_offset;
-      GL(dl_rtld_map).l_tls_modid = 1;
-      GL(dl_rtld_map).l_tls_tp_initialized
-       = info->l.l_tls_tp_initialized;
-    }
+
 #endif
 
 #if HP_TIMING_AVAIL
@@ -275,14 +272,6 @@ _dl_start (void *arg)
 #else
   struct dl_start_final_info info;
 # define bootstrap_map info.l
-#endif
-#if USE_TLS || (!DONT_USE_BOOTSTRAP_MAP && !HAVE_BUILTIN_MEMSET)
-  size_t cnt;
-#endif
-#ifdef USE_TLS
-  ElfW(Ehdr) *ehdr;
-  ElfW(Phdr) *phdr;
-  dtv_t initdtv[3];
 #endif
 
   /* This #define produces dynamic linking inline functions for
@@ -311,7 +300,7 @@ _dl_start (void *arg)
 # ifdef HAVE_BUILTIN_MEMSET
   __builtin_memset (bootstrap_map.l_info, '\0', sizeof (bootstrap_map.l_info));
 # else
-  for (cnt = 0;
+  for (size_t cnt = 0;
        cnt < sizeof (bootstrap_map.l_info) / sizeof (bootstrap_map.l_info[0]);
        ++cnt)
     bootstrap_map.l_info[cnt] = 0;
@@ -325,24 +314,21 @@ _dl_start (void *arg)
   bootstrap_map.l_ld = (void *) bootstrap_map.l_addr + elf_machine_dynamic ();
   elf_get_dynamic_info (&bootstrap_map);
 
-#if USE_TLS
-# if !defined HAVE___THREAD && !defined DONT_USE_BOOTSTRAP_MAP
-  /* Signal that we have not found TLS data so far.  */
-  bootstrap_map.l_tls_modid = 0;
-# endif
-
+#if USE___THREAD
   /* Get the dynamic linker's own program header.  First we need the ELF
      file header.  The `_begin' symbol created by the linker script points
      to it.  When we have something like GOTOFF relocs, we can use a plain
      reference to find the runtime address.  Without that, we have to rely
      on the `l_addr' value, which is not the value we want when prelinked.  */
-#ifdef DONT_USE_BOOTSTRAP_MAP
-  ehdr = (ElfW(Ehdr) *) &_begin;
-#else
-  ehdr = (ElfW(Ehdr) *) bootstrap_map.l_addr;
-#endif
-  phdr = (ElfW(Phdr) *) ((ElfW(Addr)) ehdr + ehdr->e_phoff);
-  for (cnt = 0; cnt < ehdr->e_phnum; ++cnt)
+  ElfW(Ehdr) *ehdr
+# ifdef DONT_USE_BOOTSTRAP_MAP
+    = (ElfW(Ehdr) *) &_begin;
+# else
+    = (ElfW(Ehdr) *) bootstrap_map.l_addr;
+# endif
+  ElfW(Phdr) *phdr = (ElfW(Phdr) *) ((void *) ehdr + ehdr->e_phoff);
+  size_t cnt = ehdr->e_phnum;  /* PT_TLS is usually the last phdr.  */
+  while (cnt-- > 0)
     if (phdr[cnt].p_type == PT_TLS)
       {
        void *tlsblock;
@@ -431,13 +417,11 @@ _dl_start (void *arg)
 
        /* So far this is module number one.  */
        bootstrap_map.l_tls_modid = 1;
-       /* The TP got initialized.  */
-       bootstrap_map.l_tls_tp_initialized = 1;
 
        /* There can only be one PT_TLS entry.  */
        break;
       }
-#endif /* use TLS */
+#endif /* USE___THREAD */
 
 #ifdef ELF_MACHINE_BEFORE_RTLD_RELOC
   ELF_MACHINE_BEFORE_RTLD_RELOC (bootstrap_map.l_info);
@@ -576,6 +560,15 @@ match_version (const char *string, struct link_map *map)
   return 0;
 }
 
+/* _dl_error_catch_tsd points to this for the single-threaded case.
+   It's reset by the thread library for multithreaded programs.  */
+static void ** __attribute__ ((const))
+startup_error_tsd (void)
+{
+  static void *data;
+  return &data;
+}
+
 static const char *library_path;       /* The library search path.  */
 static const char *preloadlist;                /* The list preloaded objects.  */
 static int version_info;               /* Nonzero if information about
@@ -605,6 +598,9 @@ dl_main (const ElfW(Phdr) *phdr,
   void *tcbp;
 #endif
 
+  /* Explicit initialization since the reloc would just be more work.  */
+  GL(dl_error_catch_tsd) = &startup_error_tsd;
+
   /* Process the environment variable which control the behaviour.  */
   process_envvars (&mode);
 
@@ -1564,16 +1560,9 @@ cannot allocate TLS data structures for initial thread");
         into the main thread's TLS area, which we allocated above.  */
       _dl_allocate_tls_init (tcbp);
 
-      /* And finally install it for the main thread.  */
-# ifndef HAVE___THREAD
-      TLS_INIT_TP (tcbp, GL(dl_rtld_map).l_tls_tp_initialized);
-# else
-      /* If the compiler supports the __thread keyword we know that
-        at least ld.so itself uses TLS and therefore the thread
-        pointer was initialized earlier.  */
-      assert (GL(dl_rtld_map).l_tls_tp_initialized != 0);
-      TLS_INIT_TP (tcbp, 1);
-# endif
+      /* And finally install it for the main thread.  If ld.so itself uses
+        TLS we know the thread pointer was initialized earlier.  */
+      TLS_INIT_TP (tcbp, USE___THREAD);
     }
 #endif
 
index e9add9196acd84bbfeef114c64394eef88447dfb..eed947fd3052134308ff7707cd1bd9f4595a7e2f 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 fb7925c01c594e51c200fc71c93c6944a3a14223..366fcc5c6d8d31837b20304a5a47d6242f34ede6 100644 (file)
 # define __USE_EXTERN_INLINES  1
 #endif
 
-/* This is here only because every header file already includes this one.  */
-#ifndef _LIBC
-/* Get the definitions of all the appropriate `__stub_FUNCTION' symbols.
-   <gnu/stubs.h> contains `#define __stub_FUNCTION' when FUNCTION is a stub
-   which will always return failure (and set errno to ENOSYS).
 
-   We avoid including <gnu/stubs.h> when compiling the C library itself to
-   avoid a dependency loop.  stubs.h depends on every object file.  If
-   this #include were done for the library source code, then every object
-   file would depend on stubs.h.  */
+/* This is here only because every header file already includes this one.
+   Get the definitions of all the appropriate `__stub_FUNCTION' symbols.
+   <gnu/stubs.h> contains `#define __stub_FUNCTION' when FUNCTION is a stub
+   that will always return failure (and set errno to ENOSYS).  */
+#include <gnu/stubs.h>
 
-# include <gnu/stubs.h>
-#endif
 
 #endif /* features.h  */
diff --git a/include/gnu/stubs.h b/include/gnu/stubs.h
new file mode 100644 (file)
index 0000000..6308e4e
--- /dev/null
@@ -0,0 +1,2 @@
+/* This is a placeholder used only while compiling libc.
+   The installed gnu/stubs.h file is created by make install.  */
index 9c8be662cd5059340d30e8b17fe425fc38a07721..ad4e0a4e0c0d41edb20c8ac8fdeb7a23322aad5f 100644 (file)
@@ -272,9 +272,6 @@ struct link_map
     ptrdiff_t l_tls_offset;
     /* Index of the module in the dtv array.  */
     size_t l_tls_modid;
-    /* Nonzero if the thread pointer (register or whatever it is) got
-       initialized.  */
-    int l_tls_tp_initialized;
 #endif
   };
 
index d58fe5bedacbaf491ce4935ea6668d439b961b19..423d5b496d652ff38f23f1ce6d48e2f1bfcf25ff 100644 (file)
@@ -4,7 +4,7 @@
 /* Macros for accessing h_errno from inside libc.  */
 # ifdef _LIBC_REENTRANT
 #  include <tls.h>
-#  if USE_TLS && HAVE___THREAD
+#  if USE___THREAD
 #   undef  h_errno
 #   define h_errno h_errno     /* For #ifndef h_errno tests.  */
 extern __thread int h_errno;
index b9ed35e977cba8cc6b4221434a9667ab61ce979f..2a4037c9c32fec042218c694b829e8990e56f4dc 100644 (file)
@@ -14,7 +14,7 @@
 
 # ifdef _LIBC_REENTRANT
 #  include <tls.h>
-#  if USE_TLS && HAVE___THREAD
+#  if USE___THREAD
 #   undef _res
 extern __thread struct __res_state _res;
 #  endif
index 245b8aa89e07c1c78982c8d50c5d491dee1f64b6..1e6d1782d925d0dd89cfa5b592e9c63d05ff690d 100644 (file)
@@ -1,5 +1,5 @@
 /* Macros for managing ABI-compatibility definitions using ELF symbol versions.
-   Copyright (C) 2000 Free Software Foundation, Inc.
+   Copyright (C) 2000, 2002 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
    e.g. `#if SHLIB_COMPAT (libm, GLIBC_2_0, GLIBC_2_2)' for code introduced
    in the GLIBC_2.0 version and obsoleted in the GLIBC_2.2 version.  */
 
-# define SHLIB_COMPAT(lib, introduced, obsoleted) \
-  (!(ABI_##lib##_##obsoleted - 0) \
-   || ((ABI_##lib##_##introduced - 0) < (ABI_##lib##_##obsoleted - 0)))
+# define SHLIB_COMPAT(lib, introduced, obsoleted)                            \
+  ((IS_IN_##lib - 0)                                                         \
+   && (!(ABI_##lib##_##obsoleted - 0)                                        \
+       || ((ABI_##lib##_##introduced - 0) < (ABI_##lib##_##obsoleted - 0))))
+
+# ifndef NOT_IN_libc
+#  define IS_IN_libc 1
+# endif
 
 /* That header also defines symbols like `VERSION_libm_GLIBC_2_1' to
    the version set name to use for e.g. symbols first introduced into
diff --git a/include/stubs-prologue.h b/include/stubs-prologue.h
new file mode 100644 (file)
index 0000000..0577bc6
--- /dev/null
@@ -0,0 +1,14 @@
+@ These lines with @ are omitted from the generated output.
+@ This file gives the initial contents of gnu/stubs.h, to which
+@ all the #define __stub_foo lines get appended by the makefile rule.
+@
+/* This file is automatically generated.
+   It defines a symbol `__stub_FUNCTION' for each function
+   in the C library which is a stub, meaning it will fail
+   every time called, usually setting errno to ENOSYS.  */
+
+#ifdef _LIBC
+ #error Applications may not define the macro _LIBC
+#endif
+
+@ Placeholder line so we remember to keep the preceding blank line here.
diff --git a/include/tls.h b/include/tls.h
new file mode 100644 (file)
index 0000000..2e20a45
--- /dev/null
@@ -0,0 +1,14 @@
+/* This file defines USE___THREAD to 1 or 0 to cut down on the #if mess.  */
+
+#include_next <tls.h>
+
+#if USE_TLS && HAVE___THREAD \
+    && (!defined NOT_IN_libc || defined IS_IN_libpthread)
+
+# define USE___THREAD 1
+
+#else
+
+# define USE___THREAD 0
+
+#endif
index 45c5abb7f9abc88d0cbe43e778840977764230d3..1ac2653f1694df8f4ac4e3288dd795d61a20c2ae 100644 (file)
@@ -251,6 +251,7 @@ The functions mentioned so far in this chapter are searching in a sorted
 or unsorted array.  There are other methods to organize information
 which later should be searched.  The costs of insert, delete and search
 differ.  One possible implementation is using hashing tables.
+The following functions are declared in the the header file @file{search.h}.
 
 @comment search.h
 @comment SVID
@@ -429,7 +430,8 @@ can be used with arbitrary data and not only zero-terminated strings.
 The @code{tsearch} functions have the advantage that no function to
 initialize data structures is necessary.  A simple pointer of type
 @code{void *} initialized to @code{NULL} is a valid tree and can be
-extended or searched.
+extended or searched.  The prototypes for these functions can be found
+in the header file @file{search.h}.
 
 @comment search.h
 @comment SVID
index 69fc848ffb5e267b959c14531c1dc6dd97958db9..656f8ae5023f9fc0a0b23ff56993dc8fffae415d 100644 (file)
@@ -180,7 +180,6 @@ xdrfunc *xdrfunc_head;              /* xdr function list */
 xdrfunc *xdrfunc_tail;         /* xdr function list */
 
 int
-__attribute__ ((noreturn))
 main (int argc, const char *argv[])
 {
   struct commandline cmd;
@@ -248,8 +247,8 @@ main (int argc, const char *argv[])
          mkfile_output (&cmd);
        }
     }
-  exit (nonfatalerrors);
-  /* NOTREACHED */
+
+  return nonfatalerrors;
 }
 
 /*
index 1954b2033487c3b7a7c0a96d8772d17122dcc1d0..cc2c2c1219e18f5e4fc5baa62d7e9f0c38a0bc19 100644 (file)
@@ -51,7 +51,7 @@
    We don't define an enum for the possible key values, because the KEYs
    translate directly into variables by macro magic.  */
 
-#if USE_TLS && HAVE___THREAD
+#if USE___THREAD
 # define __libc_tsd_define(CLASS, KEY) CLASS __thread void *__libc_tsd_##KEY;
 
 # define __libc_tsd_address(KEY)       (&__libc_tsd_##KEY)
similarity index 58%
rename from sysdeps/unix/sysv/linux/mips/sysdep.S
rename to sysdeps/generic/dl-sysdep.h
index 2584982bb0e23af27815fa52fe39310873196fc9..b39103cbc278b15ab45573c3f67f418c45b0e3b7 100644 (file)
@@ -1,4 +1,5 @@
-/* Copyright (C) 1998, 2002 Free Software Foundation, Inc.
+/* System-specific settings for dynamic linker code.  Generic version.
+   Copyright (C) 2002 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
-#include <sysdep.h>
+/* This macro must be defined to either 0 or 1.
 
-/* The Linux version is in fact MIPS/ELF and the start.? file for this
-   system (sysdeps/mips/elf/start.S) is also used by The Hurd.  This file
-   must not contain the definition of the `errno' variable, we have to
-   define it somewhere else.
+   If 1, then an errno global variable hidden in ld.so will work right with
+   all the errno-using libc code compiled for ld.so, and there is never a
+   need to share the errno location with libc.  This is appropriate only if
+   all the libc functions that ld.so uses are called without PLT and always
+   get the versions linked into ld.so rather than the libc ones.  */
 
-   ...and this place is here.  */
-       .bss
-       .globl  errno
-       .type   errno,@object
-       .size   errno,4
-errno: .word   4
-       .text
-weak_alias(errno, _errno)
-
-#include <sysdeps/unix/mips/sysdep.S>
+#define RTLD_PRIVATE_ERRNO 1
similarity index 68%
rename from elf/dl-xstat64.c
rename to sysdeps/generic/errno.c
index 4484f990e06a5ddb275563be81d69a497ab71083..cba5ab9c3b1fe549927f781137e3224a5cda735a 100644 (file)
@@ -1,4 +1,4 @@
-/* Dynamic linker's private version of __xstat64.
+/* Definition of `errno' variable.  Canonical version.
    Copyright (C) 2002 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
-/* This special file is needed because some xstat64.c implementations
-   use versioning for __xstat64 and we need to keep it local to
-   the dynamic linker.  */
+#include <errno.h>
+#include <tls.h>
+#undef errno
 
-#define RTLD_STAT64
-#include <xstat64.c>
+#if USE___THREAD
+__thread int errno;
+#else
+/* This differs from plain `int errno;' in that it doesn't create
+   a common definition, but a plain symbol that resides in .bss,
+   which can have an alias.  */
+int errno __attribute__ ((section (".bss")));
+strong_alias (errno, _errno)
+#endif
index c149656446e4bf0ecc229c101c6d7cb187fb6221..36582a7463ba271dfcbe12a9e238ffa7f66550d0 100644 (file)
@@ -34,6 +34,7 @@
 #include <sys/mman.h>
 #include <link.h>
 #include <dl-lookupcfg.h>
+#include <dl-sysdep.h>
 #include <bits/libc-lock.h>
 #include <hp-timing.h>
 #include <tls.h>
@@ -372,6 +373,10 @@ struct rtld_global
 
   /* Structure describing the dynamic linker itself.  */
   EXTERN struct link_map _dl_rtld_map;
+
+#ifdef _LIBC_REENTRANT
+  EXTERN void **(*_dl_error_catch_tsd) (void) __attribute__ ((const));
+#endif
 #ifdef SHARED
 };
 # define __rtld_global_attribute__
index cf7efc931a8b233b4e6c3e428b0d204f3d58b7ab..08f985c482f590fef699347f24c7f5ab0ec7af6f 100644 (file)
@@ -11,6 +11,3 @@ int __data_start = 0;
 #ifdef HAVE_WEAK_SYMBOLS
 weak_alias (__data_start, data_start)
 #endif
-
-volatile int __errno;
-strong_alias (__errno, errno)
index 1784a3a737fc2aa8bfbcf93c711474ee906af415..6f60cf3af0358189614a90544db8d141d6a56907 100644 (file)
@@ -299,7 +299,7 @@ _dl_start_user:\n\
    define the value.
    ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one
    of the main executable's symbols, as for a COPY reloc.  */
-#ifdef USE_TLS
+#if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD)
 # define elf_machine_type_class(type) \
   ((((type) == R_386_JMP_SLOT || (type) == R_386_TLS_DTPMOD32                \
      || (type) == R_386_TLS_DTPOFF32 || (type) == R_386_TLS_TPOFF32          \
@@ -411,7 +411,7 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
          *reloc_addr = value;
          break;
 
-#ifdef USE_TLS
+#if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD)
        case R_386_TLS_DTPMOD32:
 # ifdef RTLD_BOOTSTRAP
          /* During startup the dynamic linker is always the module
index 5066b8dcd611ce9e3ae85ee364dc26e41e3ca8a9..b34bbe2c9e1e213b792ad7106c07ee7cc47194ea 100644 (file)
@@ -31,7 +31,7 @@ typedef struct
 extern void *___tls_get_addr (tls_index *ti)
      __attribute__ ((__regparm__ (1)));
 extern void *___tls_get_addr_internal (tls_index *ti)
-     __attribute__ ((__regparm__ (1)));
+     __attribute__ ((__regparm__ (1))) attribute_hidden;
 
 /* The special thing about the x86 TLS ABI is that we have two
    variants of the __tls_get_addr function with different calling
@@ -50,5 +50,5 @@ __tls_get_addr (tls_index *ti)
    version of this file.  */
 # define __tls_get_addr __attribute__ ((__regparm__ (1))) ___tls_get_addr
 strong_alias (___tls_get_addr, ___tls_get_addr_internal)
-# define __TLS_GET_ADDR ___tls_get_addr
+# define __TLS_GET_ADDR ___tls_get_addr_internal
 #endif
similarity index 71%
rename from elf/dl-fxstat64.c
rename to sysdeps/mach/hurd/dl-sysdep.h
index 38d445d4d4cacc343cabffbb6d01ea189be91c31..2dc9b0a9101368794f5024261632b1e6ef1ee260 100644 (file)
@@ -1,4 +1,4 @@
-/* Dynamic linker's private version of __fxstat64.
+/* System-specific settings for dynamic linker code.  Hurd version.
    Copyright (C) 2002 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
@@ -17,9 +17,9 @@
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
-/* This special file is needed because some fxstat64.c implementations
-   use versioning for __fxstat64 and we need to keep it local to
-   the dynamic linker.  */
+/* The private errno doesn't make sense on the Hurd.  errno is always the
+   thread-local slot shared with libc, and it matters to share the cell
+   with libc because after startup we use libc functions that set errno
+   (open, mmap, etc).  */
 
-#define RTLD_STAT64
-#include <fxstat64.c>
+#define RTLD_PRIVATE_ERRNO 0
index 350ac5297a8c0bc78837a93b27e85c95947a5bd9..5e264d3cdd44ba194c9912f3a97c0868824c099f 100644 (file)
@@ -401,7 +401,7 @@ _dl_start_user:\n\
    define the value.
    ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one
    of the main executable's symbols, as for a COPY reloc.  */
-#ifdef USE_TLS
+#if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD)
 # define elf_machine_type_class(type) \
   ((((type) == R_SH_JMP_SLOT || (type) == R_SH_TLS_DTPMOD32                  \
      || (type) == R_SH_TLS_DTPOFF32 || (type) == R_SH_TLS_TPOFF32)           \
@@ -546,7 +546,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
          /* These addresses are always aligned.  */
          *reloc_addr = value;
          break;
-#ifdef USE_TLS
+#if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD)
          /* XXX Remove TLS relocations which are not needed.  */
        case R_SH_TLS_DTPMOD32:
 # ifdef RTLD_BOOTSTRAP
index 5279b8607655fc29f94d496327ba1ec7113ac5a5..05c00918e692d87a9dcf8c8f69aae5cbe163da65 100644 (file)
 #include <sysdep.h>
 #include <features.h>
 
-       .section .bss
-       .globl errno
-       .align 2
-errno: .space 4
-#ifdef __ELF__
-       .type errno, @object
-       .size errno, 4
-#endif
-       .globl __errno
-__errno = errno
-       .globl _errno
-_errno = errno
-
        .text
        .align 2
 
index a8fea14b9f27f83e923cc7f2a231d2623b0fbdb4..6088faaed14d30de289785ec51e6e4f8b425178c 100644 (file)
@@ -28,11 +28,6 @@ int __data_start = 0;
 weak_alias (__data_start, data_start)
 #endif
 
-#ifndef errno
-volatile int __errno;
-strong_alias (__errno, errno)
-#endif
-
 extern void __libc_init __P ((int argc, char **argv, char **envp));
 extern int main __P ((int argc, char **argv, char **envp));
 
index df86229ea5b1953cb7d804aac1898224e4bf7249..c2fc4882d8b98998d83b2cc24ccef95d7b1bd9fb 100644 (file)
@@ -19,9 +19,6 @@
 
 #include <sysdep.h>
 
-__errno:
-.comm errno,           4
-
 ENTRY(__start)
   .set noreorder
 
index 294865877ffccd33bae45e70a8df617a37143217..dceb6815f40cd6fc6e6bbda5b675a6f38c3c8943 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
 
index 0a7b5fba5641dc8c3fa095a18b5e5600414b6232..e85a21dd9b172c351f3dcac3fb7f4b2561fb9621 100644 (file)
@@ -128,7 +128,8 @@ shared-only-routines += $file
     ;;
   *)
     echo "\
-\$(foreach o,\$(object-suffixes),\$(objpfx)$file\$o): \\"
+\$(foreach o,\$(object-suffixes),\$(objpfx)$file\$o) \
+\$(objpfx)rtld-$file.os: \\"
     ;;
   esac
 
index 3191753505f64e5119f46ee4450456a3980c7bca..664cb9dbafa692a88b078b677fa7a71dc359e305 100644 (file)
@@ -39,10 +39,6 @@ int __data_start = 0;
 weak_alias (__data_start, data_start)
 #endif
 
-VOLATILE int __errno;
-strong_alias (__errno, errno)
-
-
 extern void __libc_init __P ((int argc, char **argv, char **envp));
 extern int main __P ((int argc, char **argv, char **envp));
 
index 49c96403fea0e56ab563943af8cd4135f3efc6f2..af524751b4ea777447aab8a896c003053967c305 100644 (file)
@@ -35,13 +35,6 @@ weak_alias (__data_start, data_start)
 #define        DECL_DUMMIES
 #endif
 
-#ifndef errno
-/* __errno must be initialized since otherwise one cannot create an
-   alias (at least on some platforms).  */
-volatile int __errno = 0;
-strong_alias (__errno, errno)
-#endif
-
 extern void __libc_init (int argc, char **argv, char **envp);
 extern int main (int argc, char **argv, char **envp);
 
index 719d017993c26a484bee157767d125e749eb5a11..a88d0d4d1b305536943cdad278fd0b57f494d87c 100644 (file)
@@ -27,9 +27,6 @@
 /* The first piece of initialized data.  */
 int __data_start = 0;
 
-__volatile int __errno = 0;
-strong_alias (__errno, errno)
-
 extern void __libc_init __P ((int argc, char **argv, char **envp));
 extern int main __P ((int argc, char **argv, char **envp));
 
index 48dcffae138a42273305b75f11c721d4bff8d818..1a4de2adb3f94c317999a16f725874b57d6cd131 100644 (file)
 
 #include <sysdep.h>
 
-/* We define errno here, to be consistent with Linux/i386.  */
-       .bss
-       .globl C_SYMBOL_NAME(errno)
-       .type C_SYMBOL_NAME(errno),%object
-       .size C_SYMBOL_NAME(errno),4
-C_SYMBOL_NAME(errno):  .zero 4
-weak_alias (errno, _errno)
        .text
 
 /* The syscall stubs jump here when they detect an error.
index 64fb8505af0a1b019c5e5e7fdcc09f8ef67bca33..e53e7bbfb999edc3ff9b1612d4ab5846c3d01197 100644 (file)
 
 #include <sysdep.h>
 
-/* Make space for the errno variable.  */
-
-       .globl  C_SYMBOL_NAME(errno)
-       .type   C_SYMBOL_NAME(errno),@object
-       .lcomm  C_SYMBOL_NAME(errno),4
-
-weak_alias (errno, _errno)
-
 /* The syscall stubs jump here when they detect an error, bot for PIC and
    non-PIC.  */
 
index e64d8dfacb5f06cebb743b44d0fa93bb28cef7d9..f5e16050b6aaf5cfb9355372e36ebff70e1d9154 100644 (file)
@@ -84,17 +84,14 @@ ___fxstat64 (int vers, int fd, struct stat64 *buf)
 #endif
 }
 
-#ifndef RTLD_STAT64
-# include <shlib-compat.h>
+#include <shlib-compat.h>
 
+#if SHLIB_COMPAT(libc, GLIBC_2_1, GLIBC_2_2)
 versioned_symbol (libc, ___fxstat64, __fxstat64, GLIBC_2_2);
-
-# if SHLIB_COMPAT(libc, GLIBC_2_1, GLIBC_2_2)
 strong_alias (___fxstat64, __old__fxstat64)
 compat_symbol (libc, __old__fxstat64, __fxstat64, GLIBC_2_1);
-# endif
-
+hidden_ver (___fxstat64, __fxstat64)
 #else
-strong_alias (___fxstat64, __fxstat64);
+strong_alias (___fxstat64, __fxstat64)
+hidden_def (__fxstat64)
 #endif
-hidden_ver (___fxstat64, __fxstat64)
index b333b7013d677fe6b66e8cb337653b9463f36998..bf4d4af5c7568da969ef9f69113c3ceb352f4647 100644 (file)
@@ -28,11 +28,6 @@ __syscall_error (int err_no)
   return -1;
 }
 
-/* We also have to have a 'real' definition of errno.  */
-#undef errno
-int errno = 0;
-weak_alias (errno, _errno)
-
 
 /* HPPA implements syscall() in 'C'; the assembler version would
    typically be in syscall.S.  */
index 9546bb3c64ca4120e6ca977051d884d788b5a633..b8df43cd7cce4cbb4640dd69378a1c04cb723862 100644 (file)
    02111-1307 USA.  */
 
 #include <sysdep.h>
-#include <tls.h>
-
-/* The Linux version is in fact i386/ELF and the start.? file for this
-   system (sysdeps/i386/elf/start.S) is also used by The Hurd.  This file
-   must not contain the definition of the `errno' variable, we have to
-   define it somewhere else.
-
-   ...and this place is here.  */
-#if USE_TLS && HAVE___THREAD
-       .section .tbss
-#else
-       .bss
-#endif
-       .globl  errno
-       .type errno,@object
-       .size errno,4
-       .globl  _errno
-       .type _errno,@object
-       .size _errno,4
-       .align 4
-errno:
-_errno:
-       .space  4
 
 /* The following code is only used in the shared library when we
    compile the reentrant version.  Otherwise each system call defines
index ed0bdf6b7d3d47d4be908debe5d5917e9bcc4f29..87dfe9042ce5f5601b341211f4b4ef98aafc7161 100644 (file)
 #include <bp-asm.h>
 #include <tls.h>
 
+
+#ifdef IS_IN_rtld
+# include <dl-sysdep.h>                /* Defines RTLD_PRIVATE_ERRNO.  */
+#endif
+
+
 /* For Linux we can use the system call table in the header file
        /usr/include/asm/unistd.h
    of the kernel.  But these symbols do not follow the SYS_* syntax
@@ -92,10 +98,19 @@ __i686.get_pc_thunk.reg:                                                  \
   call __i686.get_pc_thunk.reg
 # endif
 
-/* Store (- %eax) into errno through the GOT.  */
-# ifdef _LIBC_REENTRANT
+# if RTLD_PRIVATE_ERRNO
+#  define SYSCALL_ERROR_HANDLER                                                      \
+0:SETUP_PIC_REG(cx);                                                         \
+  addl $_GLOBAL_OFFSET_TABLE_, %ecx;                                         \
+  xorl %edx, %edx;                                                           \
+  subl %eax, %edx;                                                           \
+  movl %edx, errno@GOTOFF(%ecx);                                             \
+  orl $-1, %eax;                                                             \
+  jmp L(pseudo_end);
 
-#  if USE_TLS && HAVE___THREAD
+# elif defined _LIBC_REENTRANT
+
+#  if USE___THREAD
 #   define SYSCALL_ERROR_HANDLER                                             \
 0:SETUP_PIC_REG (cx);                                                        \
   addl $_GLOBAL_OFFSET_TABLE_, %ecx;                                         \
@@ -125,6 +140,7 @@ __i686.get_pc_thunk.reg:                                                  \
    not modify the stack!  */
 #  endif
 # else
+/* Store (- %eax) into errno through the GOT.  */
 #  define SYSCALL_ERROR_HANDLER                                                      \
 0:SETUP_PIC_REG(cx);                                                 \
   addl $_GLOBAL_OFFSET_TABLE_, %ecx;                                         \
@@ -273,6 +289,21 @@ asm (".L__X'%ebx = 1\n\t"
    call.  */
 #undef INLINE_SYSCALL
 #define INLINE_SYSCALL(name, nr, args...) \
+  ({                                                                         \
+    unsigned int resultvar = INTERNAL_SYSCALL(name, nr, args);               \
+    if (resultvar >= 0xfffff001)                                             \
+      {                                                                              \
+       __set_errno (-resultvar);                                             \
+       resultvar = 0xffffffff;                                               \
+      }                                                                              \
+    (int) resultvar; })
+
+/* Define a macro which expands inline into the wrapper code for a system
+   call.  This use is for internal calls that do not need to handle errors
+   normally.  It will never touch errno.  This returns just what the kernel
+   gave back.  */
+#undef INTERNAL_SYSCALL
+#define INTERNAL_SYSCALL(name, nr, args...) \
   ({                                                                         \
     unsigned int resultvar;                                                  \
     asm volatile (                                                           \
@@ -282,11 +313,6 @@ asm (".L__X'%ebx = 1\n\t"
     RESTOREARGS_##nr                                                         \
     : "=a" (resultvar)                                                       \
     : "i" (__NR_##name) ASMFMT_##nr(args) : "memory", "cc");                 \
-    if (resultvar >= 0xfffff001)                                             \
-      {                                                                              \
-       __set_errno (-resultvar);                                             \
-       resultvar = 0xffffffff;                                               \
-      }                                                                              \
     (int) resultvar; })
 
 #define LOADARGS_0
index 2008b84e8854c11becd33ed0714f0e2ceac40c40..31b5f9bde99f84d77cc4ce74e4e0c3a6755deb62 100644 (file)
 #include <sysdep.h>
 #include <features.h>
 
-       .global errno
-       .common errno,4,4
-       .type errno, @object
-       .size errno, 4
-
-       .global __errno
-__errno = errno
-
-       .global _errno
-_errno = errno
-
 ENTRY(__syscall_error)
 #ifdef _LIBC_REENTRANT
        .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(0)
index 0a2920001428b304d5fe38d47195a1c722f612ad..e7f488848c509cfb5dfe79d0cd95ab73feb1e18c 100644 (file)
@@ -85,17 +85,14 @@ ___lxstat64 (int vers, const char *name, struct stat64 *buf)
 #endif
 }
 
-#ifndef RTLD_STAT64
-# include <shlib-compat.h>
+#include <shlib-compat.h>
 
+#if SHLIB_COMPAT(libc, GLIBC_2_1, GLIBC_2_2)
 versioned_symbol (libc, ___lxstat64, __lxstat64, GLIBC_2_2);
-
-# if SHLIB_COMPAT(libc, GLIBC_2_1, GLIBC_2_2)
 strong_alias (___lxstat64, __old__lxstat64)
 compat_symbol (libc, __old__lxstat64, __lxstat64, GLIBC_2_1);
-# endif
-
+hidden_ver (___lxstat64, __lxstat64)
 #else
 strong_alias (___lxstat64, __lxstat64);
+hidden_def (__lxstat64)
 #endif
-hidden_ver (___lxstat64, __lxstat64)
index 628335b8d0275bcd9cbbbb882c4a55975e3d3609..e4ec92d836bd4fe4c42f8b7fb0886e6aa8078826 100644 (file)
 
 #include <sysdep.h>
 
-/* The Linux version is in fact m68k/ELF and the start.? file for this
-   system (sysdeps/m68k/elf/start.S) is also used by The Hurd.  This file
-   must not contain the definition of the `errno' variable, we have to
-   define it somewhere else.
-
-   ...and this place is here.  */
-       .bss
-       .globl errno
-       .type errno,@object
-errno: .space 4
-       .size errno,4
-weak_alias (errno, _errno)
-       .text
 
 /* The following code is only used in the shared library when we
    compile the reentrant version.  Otherwise each system call defines
index 8703c03e257a3474eee412f112e1ec45bd00ec11..f16c4c938f724e96f2227920da9741ebcb49cd1e 100644 (file)
@@ -27,8 +27,3 @@ __syscall_error (int err_no)
   __set_errno (err_no);
   return -1;
 }
-
-/* We also have to have a 'real' definition of errno.  */
-#undef errno
-int errno = 0;
-weak_alias (errno, _errno)
index 5b17f6ba4b2ebc670d7337e1f2518a2e0125c8ed..98b00722d856ec3895508e3d9d1952fe1581cf26 100644 (file)
 
 #include <sysdep.h>
 
-/* The Linux version is in fact S390-32/ELF and the start.? file for this
-   system (sysdeps/s390/s390-32/elf/start.S) is also used by The Hurd.
-   This file must not contain the definition of the `errno' variable,
-   we have to define it somewhere else.
-
-    ...and this place is here.  */
-       .bss
-       .globl  errno
-       .type errno,@object
-       .size errno,4
-errno:
-       .space  4
-weak_alias (errno, _errno)
-
 /* The following code is only used in the shared library when we
    compile the reentrant version.  Otherwise each system call defines
    each own version.  */
index caa50ccc3dc5e1b442e74e8c110f61e955932e33..a29b0b983a33eec387ae170eac130b81e78293c0 100644 (file)
 
 #include <sysdep.h>
 
-/* The Linux version is in fact S390-64/ELF and the start.? file for this
-   system (sysdeps/s390/s390-64/elf/start.S) is also used by The Hurd.
-   This file must not contain the definition of the `errno' variable,
-   we have to define it somewhere else.
-
-    ...and this place is here.  */
-       .bss
-       .globl  errno
-       .type errno,@object
-       .size errno,4
-errno:
-       .space  4
-weak_alias (errno, _errno)
 
 /* The following code is only used in the shared library when we
    compile the reentrant version.  Otherwise each system call defines
index 3f4b0dd0a23501866cebcc6ad381660fa7975e14..33fdc748b5d5c89a793c9c454575cfa82c48d8d6 100644 (file)
 
 #include <sysdep.h>
 
-/* We define errno here, to be consistent with Linux/i386.  */
-
-       .section .bss
-       .align 2
-       .globl C_SYMBOL_NAME(errno)
-       .type C_SYMBOL_NAME(errno), @object
-       .size C_SYMBOL_NAME(errno), 4
-C_SYMBOL_NAME(errno):
-       .space  4
-weak_alias (errno, _errno)
-       .text
-
 /* The syscall stubs jump here when they detect an error.
    The code for Linux is almost identical to the canonical Unix
    code, except that the error number in R0 is negated.  */
index 437060e8662866083bc05e1f5b208f3e4fcf7e4e..b031238ceb38b7a556dcc04e001730a934560ee4 100644 (file)
@@ -1,30 +1 @@
-/* Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Richard Henderson <richard@gnu.ai.mit.edu>, 1997.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-
-/* Define errno */
-
-       .section .bss
-       .globl errno
-       .align 4
-errno: .space 4
-       .type errno, @object
-       .size errno, 4
-
-weak_alias (errno, _errno)
+/* Nothing to do here.  */
index 00086ca1e4e275124697bf20f8d248d06c752f8c..5b72cef205a5c384e241b9bf985a180a8cd903ec 100644 (file)
    02111-1307 USA.  */
 
 #include <sysdep.h>
-#include <tls.h>
-
-/* The Linux version is in fact x86-64/ELF and the start.? file for this
-   system (sysdeps/x86_64/elf/start.S) is also used by The Hurd.  This file
-   must not contain the definition of the `errno' variable, we have to
-   define it somewhere else.
-
-   ...and this place is here.  */
-#if USE_TLS && HAVE___THREAD
-       .section .tbss
-#else
-       .bss
-#endif
-       .globl  errno
-       .type errno,@object
-       .size errno,4
-       .globl  _errno
-       .type _errno,@object
-       .size _errno,4
-       .align 4
-errno:
-_errno:
-       .space  4
-
 
 /* The following code is only used in the shared library when we
    compile the reentrant version.  Otherwise each system call defines
index 5588b4606ef9bd33e93fd427c7d9eb34638e7464..b0f51b4072ad785a6cae1ecf051c9d6f5198880c 100644 (file)
 #include <bp-sym.h>
 #include <bp-asm.h>
 
+#ifdef IS_IN_rtld
+# include <dl-sysdep.h>                /* Defines RTLD_PRIVATE_ERRNO.  */
+#endif
+
 /* For Linux we can use the system call table in the header file
        /usr/include/asm/unistd.h
    of the kernel.  But these symbols do not follow the SYS_* syntax
 
 #ifndef PIC
 #define SYSCALL_ERROR_HANDLER  /* Nothing here; code in sysdep.S is used.  */
-#elif USE_TLS && HAVE___THREAD
+#elif USE___THREAD
 # define SYSCALL_ERROR_HANDLER                 \
   movq errno@GOTTPOFF(%rip), %rcx;             \
   xorq %rdx, %rdx;                             \
   subq %rax, %rdx;                             \
   movl %eax, %fs:0(%rcx)
+#elif RTLD_PRIVATE_ERRNO
+# define SYSCALL_ERROR_HANDLER                 \
+  leaq errno(%rip), %rcx;                      \
+  xorq %rdx, %rdx;                             \
+  subq %rax, %rdx;                             \
+  movl %eax, (%rcx)
 #elif defined _LIBC_REENTRANT
 /* Store (- %rax) into errno through the GOT.
    Note that errno occupies only 4 bytes.  */
index 388ff8fa688a38dc2dd6003133feb50df94d3d89..7835fc20501f88fb1d51c62a3720bef0a5e66771 100644 (file)
@@ -88,17 +88,15 @@ ___xstat64 (int vers, const char *name, struct stat64 *buf)
 #endif
 }
 
-#ifndef RTLD_STAT64
-# include <shlib-compat.h>
 
-versioned_symbol (libc, ___xstat64, __xstat64, GLIBC_2_2);
+#include <shlib-compat.h>
 
-# if SHLIB_COMPAT(libc, GLIBC_2_1, GLIBC_2_2)
+#if SHLIB_COMPAT(libc, GLIBC_2_1, GLIBC_2_2)
+versioned_symbol (libc, ___xstat64, __xstat64, GLIBC_2_2);
 strong_alias (___xstat64, __old__xstat64)
 compat_symbol (libc, __old__xstat64, __xstat64, GLIBC_2_1);
-# endif
-
+hidden_ver (___xstat64, __xstat64)
 #else
-strong_alias (___xstat64, __xstat64);
+strong_alias (___xstat64, __xstat64)
+hidden_def (__xstat64)
 #endif
-hidden_ver (___xstat64, __xstat64)
index b0580a39aee6ec4d680cdef40a11160690f7eff7..dfa92dcd2c09206c92c5aab56d86269beaabf58c 100644 (file)
 #include <bp-sym.h>
 #include <tls.h>
 
+#ifdef IS_IN_rtld
+# include <dl-sysdep.h>                /* Defines RTLD_PRIVATE_ERRNO.  */
+#endif
+
 .globl C_SYMBOL_NAME(errno)
 .globl syscall_error
 
@@ -41,7 +45,7 @@ syscall_error:
        movq $EAGAIN, %rax      /* Yes; translate it to EAGAIN.  */
 notb:
 #endif
-#if USE_TLS && HAVE___THREAD
+#if USE___THREAD
 # ifdef PIC
        movq C_SYMBOL_NAME(errno@GOTTPOFF)(%rip), %rcx
        movl %eax, %fs:0(%rcx)
@@ -60,7 +64,10 @@ notb:
        movl %ecx, (%rax)
 # endif
 #else
-# ifndef _LIBC_REENTRANT
+# if RTLD_PRIVATE_ERRNO
+       leaq errno(%rip), %rcx
+       movl %eax, (%rcx)
+# elif !defined _LIBC_REENTRANT
        movq C_SYMBOL_NAME(errno)@GOTPCREL(%rip), %rcx
        movl %eax, (%rcx)
 # else
index 21459b9ab5b1565c13ae34852b41021694069800..740d6b7feb36a8c88cb25cb734011a81318cd486 100644 (file)
@@ -288,7 +288,7 @@ _dl_start_user:\n\
    define the value.
    ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one
    of the main executable's symbols, as for a COPY reloc.  */
-#ifdef USE_TLS
+#if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD)
 # define elf_machine_type_class(type)                                        \
   ((((type) == R_X86_64_JUMP_SLOT                                            \
      || (type) == R_X86_64_DTPMOD64                                          \
@@ -389,7 +389,7 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
        value += sym->st_value;
 #endif
 
-#if defined RTLD_BOOTSTRAP && !(USE_TLS && HAVE___THREAD)
+#if defined RTLD_BOOTSTRAP && !USE___THREAD
       assert (r_type == R_X86_64_GLOB_DAT || r_type == R_X86_64_JUMP_SLOT);
       *reloc_addr = value + reloc->r_addend;
 #else