* 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.
This commit is contained in:
Roland McGrath 2002-10-11 10:52:20 +00:00
parent 28654d2a06
commit ce460d04a5
59 changed files with 621 additions and 397 deletions

139
ChangeLog
View File

@ -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> 2002-10-11 Roland McGrath <roland@redhat.com>
* sysdeps/generic/dl-tls.c (__tls_get_addr): After freeing block in * sysdeps/generic/dl-tls.c (__tls_get_addr): After freeing block in

View File

@ -627,11 +627,15 @@ endif # $(+cflags) == ""
libio-include = -I$(..)libio libio-include = -I$(..)libio
# These are the variables that the implicit compilation rules use. # 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) \ CPPFLAGS = $($(subdir)-CPPFLAGS) $(+includes) $(defines) \
-include $(..)include/libc-symbols.h $(sysdep-CPPFLAGS) \ -include $(..)include/libc-symbols.h $(sysdep-CPPFLAGS) \
$(CPPFLAGS-$(suffix $@)) $(CPPFLAGS-$(<F)) $(CPPFLAGS-$(@F)) \ $(CPPFLAGS-$(suffix $@)) $(CPPFLAGS-$(<F)) $(CPPFLAGS-$(@F)) \
$(CPPFLAGS-$(patsubst %$(suffix $@),%,$(@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)) $(CFLAGS-$(suffix $@)) $(CFLAGS-$(<F)) $(CFLAGS-$(@F))
# If everything is compiled with -fPIC (implicitly) we must tell this by # If everything is compiled with -fPIC (implicitly) we must tell this by

View File

@ -51,7 +51,7 @@
We don't define an enum for the possible key values, because the KEYs We don't define an enum for the possible key values, because the KEYs
translate directly into variables by macro magic. */ 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_define(CLASS, KEY) CLASS __thread void *__libc_tsd_##KEY;
# define __libc_tsd_address(KEY) (&__libc_tsd_##KEY) # define __libc_tsd_address(KEY) (&__libc_tsd_##KEY)

View File

@ -4,4 +4,4 @@
cpp-src := $(firstword $(cpp-srcs-left)) cpp-src := $(firstword $(cpp-srcs-left))
cpp-srcs-left := $(filter-out $(cpp-src),$(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

View File

@ -28,6 +28,7 @@ subdir := csu
routines = init-first libc-start $(libc-init) sysdep version check_fds \ routines = init-first libc-start $(libc-init) sysdep version check_fds \
libc-tls libc-tls
aux = errno
elide-routines.os = libc-tls elide-routines.os = libc-tls
csu-dummies = $(filter-out $(start-installed-name),crt1.o Mcrt1.o) csu-dummies = $(filter-out $(start-installed-name),crt1.o Mcrt1.o)
extra-objs = start.o gmon-start.o \ extra-objs = start.o gmon-start.o \

View File

@ -23,7 +23,7 @@ subdir := elf
headers = elf.h bits/elfclass.h link.h headers = elf.h bits/elfclass.h link.h
routines = $(dl-routines) dl-open dl-close dl-support dl-iteratephdr \ routines = $(dl-routines) dl-open dl-close dl-support dl-iteratephdr \
dl-iteratephdr-static dl-addr enbl-secure dl-profstub \ 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 # The core dynamic linking functions are in libc for the static and
# profiled libraries. # 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 # ld.so uses those routines, plus some special stuff for being the program
# interpreter and operating independent of libc. # interpreter and operating independent of libc.
rtld-routines := rtld $(dl-routines) dl-sysdep dl-environ dl-minimal \ rtld-routines := rtld $(dl-routines) dl-sysdep dl-environ dl-minimal
dl-xstat64 dl-fxstat64
all-rtld-routines = $(rtld-routines) $(sysdep-rtld-routines) 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 \ dl-cache.h dl-hash.h soinit.c sofini.c ldd.bash.in \
genrtldtbl.awk atomicity.h dl-procinfo.h ldsodefs.h \ genrtldtbl.awk atomicity.h dl-procinfo.h ldsodefs.h \
dl-librecon.h interp.c sln.c dl-dst.h hp-timing.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 endif
# Command to link into a larger single relocatable object. # 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) $(objpfx)dl-allobjs.os: $(all-rtld-routines:%=$(objpfx)%.os)
$(reloc-link) $^ $(reloc-link) -o $@ $^
# Link together the dynamic linker into a single relocatable object. # Link together the dynamic linker into a single relocatable object.
$(objpfx)librtld.os: $(objpfx)dl-allobjs.os $(common-objpfx)libc_pic.a # First we do a link against libc_pic.a just to get a link map,
$(reloc-link) '-Wl,-(' $^ -lgcc '-Wl,-)' # 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) $(objpfx)ld.so: $(objpfx)librtld.os $(ld-map)
@rm -f $@.lds @rm -f $@.lds
@ -209,6 +244,7 @@ $(objpfx)trusted-dirs.st: Makefile $(..)Makeconfig
$(make-target-directory) $(make-target-directory)
echo "$(subst :, ,$(default-rpath) $(user-defined-trusted-dirs))" \ echo "$(subst :, ,$(default-rpath) $(user-defined-trusted-dirs))" \
| $(AWK) -f gen-trusted-dirs.awk > ${@:st=T}; | $(AWK) -f gen-trusted-dirs.awk > ${@:st=T};
echo '#define DL_DST_LIB "$(notdir $(slibdir))"' >> ${@:st=T}
$(move-if-change) ${@:st=T} ${@:st=h} $(move-if-change) ${@:st=T} ${@:st=h}
touch $@ touch $@
CPPFLAGS-dl-load.c = -I$(objpfx). -I$(csu-objpfx). 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-dl-cache.c = $(SYSCONF-FLAGS)
CFLAGS-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)))) test-modules = $(addprefix $(objpfx),$(addsuffix .so,$(strip $(modules-names))))
generated += $(addsuffix .so,$(strip $(modules-names))) generated += $(addsuffix .so,$(strip $(modules-names)))

View File

@ -23,7 +23,6 @@
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <ldsodefs.h> #include <ldsodefs.h>
#include <bits/libc-tsd.h>
/* This structure communicates state between _dl_catch_error and /* This structure communicates state between _dl_catch_error and
_dl_signal_error. */ _dl_signal_error. */
@ -38,11 +37,8 @@ struct catch
calls can come from `_dl_map_object_deps', `_dlerror_run', or from calls can come from `_dl_map_object_deps', `_dlerror_run', or from
any of the libc functionality which loads dynamic objects (NSS, iconv). any of the libc functionality which loads dynamic objects (NSS, iconv).
Therefore we have to be prepared to save the state in thread-local Therefore we have to be prepared to save the state in thread-local
memory. */ 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. */
__libc_tsd_define (static, DL_ERROR)
#define tsd_getspecific() __libc_tsd_get (DL_ERROR)
#define tsd_setspecific(data) __libc_tsd_set (DL_ERROR, (data))
/* This message we return as a last resort. We define the string in a /* 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) if (! errstring)
errstring = N_("DYNAMIC LINKER BUG!!!"); errstring = N_("DYNAMIC LINKER BUG!!!");
lcatch = tsd_getspecific (); lcatch = *((*GL(dl_error_catch_tsd)) ());
if (objname == NULL) if (objname == NULL)
objname = ""; objname = "";
if (lcatch != NULL) if (lcatch != NULL)
@ -151,20 +147,21 @@ _dl_catch_error (const char **objname, const char **errstring,
inefficient. So we initialize `c' by hand. */ inefficient. So we initialize `c' by hand. */
c.errstring = NULL; c.errstring = NULL;
old = tsd_getspecific (); void **catchp = (*GL(dl_error_catch_tsd)) ();
old = *catchp;
errcode = setjmp (c.env); errcode = setjmp (c.env);
if (__builtin_expect (errcode, 0) == 0) if (__builtin_expect (errcode, 0) == 0)
{ {
tsd_setspecific (&c); *catchp = &c;
(*operate) (args); (*operate) (args);
tsd_setspecific (old); *catchp = old;
*objname = NULL; *objname = NULL;
*errstring = NULL; *errstring = NULL;
return 0; return 0;
} }
/* We get here only if we longjmp'd out of OPERATE. */ /* We get here only if we longjmp'd out of OPERATE. */
tsd_setspecific (old); *catchp = old;
*objname = c.objname; *objname = c.objname;
*errstring = c.errstring; *errstring = c.errstring;
return errcode == -1 ? 0 : errcode; return errcode == -1 ? 0 : errcode;
@ -176,18 +173,19 @@ void
internal_function internal_function
_dl_receive_error (receiver_fct fct, void (*operate) (void *), void *args) _dl_receive_error (receiver_fct fct, void (*operate) (void *), void *args)
{ {
void **catchp = (*GL(dl_error_catch_tsd)) ();
struct catch *old_catch; struct catch *old_catch;
receiver_fct old_receiver; receiver_fct old_receiver;
old_catch = tsd_getspecific (); old_catch = *catchp;
old_receiver = receiver; old_receiver = receiver;
/* Set the new values. */ /* Set the new values. */
tsd_setspecific (NULL); *catchp = NULL;
receiver = fct; receiver = fct;
(*operate) (args); (*operate) (args);
tsd_setspecific (old_catch); *catchp = old_catch;
receiver = old_receiver; receiver = old_receiver;
} }

View File

@ -353,19 +353,3 @@ strong_alias (__strsep, __strsep_g)
up to 36. We don't need this here. */ up to 36. We don't need this here. */
const char INTUSE(_itoa_lower_digits)[16] attribute_hidden const char INTUSE(_itoa_lower_digits)[16] attribute_hidden
= "0123456789abcdef"; = "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

View File

@ -31,6 +31,7 @@
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/uio.h> #include <sys/uio.h>
#include <stdio-common/_itoa.h> #include <stdio-common/_itoa.h>
#include <bits/libc-lock.h>
#ifndef MAP_ANON #ifndef MAP_ANON
/* This is the only dl-sysdep.c function that is actually needed at run-time /* 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. */ /* 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); __writev (fd, iov, niov);
__libc_lock_unlock_recursive (GL(dl_load_lock));
#else
__writev (fd, iov, niov);
#endif
} }

54
elf/dl-tsd.c Normal file
View File

@ -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

115
elf/rtld-Rules Normal file
View File

@ -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

View 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; GL(dl_rtld_map).l_map_end = (ElfW(Addr)) _end;
/* Copy the TLS related data if necessary. */ /* Copy the TLS related data if necessary. */
#if USE_TLS && !defined DONT_USE_BOOTSTRAP_MAP #if USE_TLS && !defined DONT_USE_BOOTSTRAP_MAP
# ifdef HAVE___THREAD # if USE___THREAD
assert (info->l.l_tls_modid != 0); 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 # else
if (info->l.l_tls_modid != 0) assert (info->l.l_tls_modid == 0);
# endif # 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 #endif
#if HP_TIMING_AVAIL #if HP_TIMING_AVAIL
@ -275,14 +272,6 @@ _dl_start (void *arg)
#else #else
struct dl_start_final_info info; struct dl_start_final_info info;
# define bootstrap_map info.l # 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 #endif
/* This #define produces dynamic linking inline functions for /* This #define produces dynamic linking inline functions for
@ -311,7 +300,7 @@ _dl_start (void *arg)
# ifdef HAVE_BUILTIN_MEMSET # ifdef HAVE_BUILTIN_MEMSET
__builtin_memset (bootstrap_map.l_info, '\0', sizeof (bootstrap_map.l_info)); __builtin_memset (bootstrap_map.l_info, '\0', sizeof (bootstrap_map.l_info));
# else # else
for (cnt = 0; for (size_t cnt = 0;
cnt < sizeof (bootstrap_map.l_info) / sizeof (bootstrap_map.l_info[0]); cnt < sizeof (bootstrap_map.l_info) / sizeof (bootstrap_map.l_info[0]);
++cnt) ++cnt)
bootstrap_map.l_info[cnt] = 0; 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 (); bootstrap_map.l_ld = (void *) bootstrap_map.l_addr + elf_machine_dynamic ();
elf_get_dynamic_info (&bootstrap_map); elf_get_dynamic_info (&bootstrap_map);
#if USE_TLS #if USE___THREAD
# 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
/* Get the dynamic linker's own program header. First we need the ELF /* Get the dynamic linker's own program header. First we need the ELF
file header. The `_begin' symbol created by the linker script points 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 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 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. */ on the `l_addr' value, which is not the value we want when prelinked. */
#ifdef DONT_USE_BOOTSTRAP_MAP ElfW(Ehdr) *ehdr
ehdr = (ElfW(Ehdr) *) &_begin; # ifdef DONT_USE_BOOTSTRAP_MAP
#else = (ElfW(Ehdr) *) &_begin;
ehdr = (ElfW(Ehdr) *) bootstrap_map.l_addr; # else
#endif = (ElfW(Ehdr) *) bootstrap_map.l_addr;
phdr = (ElfW(Phdr) *) ((ElfW(Addr)) ehdr + ehdr->e_phoff); # endif
for (cnt = 0; cnt < ehdr->e_phnum; ++cnt) 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) if (phdr[cnt].p_type == PT_TLS)
{ {
void *tlsblock; void *tlsblock;
@ -431,13 +417,11 @@ _dl_start (void *arg)
/* So far this is module number one. */ /* So far this is module number one. */
bootstrap_map.l_tls_modid = 1; 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. */ /* There can only be one PT_TLS entry. */
break; break;
} }
#endif /* use TLS */ #endif /* USE___THREAD */
#ifdef ELF_MACHINE_BEFORE_RTLD_RELOC #ifdef ELF_MACHINE_BEFORE_RTLD_RELOC
ELF_MACHINE_BEFORE_RTLD_RELOC (bootstrap_map.l_info); ELF_MACHINE_BEFORE_RTLD_RELOC (bootstrap_map.l_info);
@ -576,6 +560,15 @@ match_version (const char *string, struct link_map *map)
return 0; 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 *library_path; /* The library search path. */
static const char *preloadlist; /* The list preloaded objects. */ static const char *preloadlist; /* The list preloaded objects. */
static int version_info; /* Nonzero if information about static int version_info; /* Nonzero if information about
@ -605,6 +598,9 @@ dl_main (const ElfW(Phdr) *phdr,
void *tcbp; void *tcbp;
#endif #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 the environment variable which control the behaviour. */
process_envvars (&mode); 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. */ into the main thread's TLS area, which we allocated above. */
_dl_allocate_tls_init (tcbp); _dl_allocate_tls_init (tcbp);
/* And finally install it for the main thread. */ /* And finally install it for the main thread. If ld.so itself uses
# ifndef HAVE___THREAD TLS we know the thread pointer was initialized earlier. */
TLS_INIT_TP (tcbp, GL(dl_rtld_map).l_tls_tp_initialized); TLS_INIT_TP (tcbp, USE___THREAD);
# 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
} }
#endif #endif

View File

@ -4,16 +4,34 @@
#if defined _ERRNO_H && !defined _ISOMAC #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 # undef errno
# define errno errno /* For #ifndef errno tests. */ # define errno errno /* For #ifndef errno tests. */
extern __thread int errno; extern int errno attribute_hidden;
# define __set_errno(val) (errno = (val)) # define __set_errno(val) (errno = (val))
# else # 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 */ #endif /* _ERRNO_H */

View File

@ -306,18 +306,12 @@
# define __USE_EXTERN_INLINES 1 # define __USE_EXTERN_INLINES 1
#endif #endif
/* This is here only because every header file already includes this one. */
#ifndef _LIBC /* This is here only because every header file already includes this one.
/* Get the definitions of all the appropriate `__stub_FUNCTION' symbols. Get the definitions of all the appropriate `__stub_FUNCTION' symbols.
<gnu/stubs.h> contains `#define __stub_FUNCTION' when FUNCTION is a stub <gnu/stubs.h> contains `#define __stub_FUNCTION' when FUNCTION is a stub
which will always return failure (and set errno to ENOSYS). that will always return failure (and set errno to ENOSYS). */
#include <gnu/stubs.h>
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. */
# include <gnu/stubs.h>
#endif
#endif /* features.h */ #endif /* features.h */

2
include/gnu/stubs.h Normal file
View File

@ -0,0 +1,2 @@
/* This is a placeholder used only while compiling libc.
The installed gnu/stubs.h file is created by make install. */

View File

@ -272,9 +272,6 @@ struct link_map
ptrdiff_t l_tls_offset; ptrdiff_t l_tls_offset;
/* Index of the module in the dtv array. */ /* Index of the module in the dtv array. */
size_t l_tls_modid; size_t l_tls_modid;
/* Nonzero if the thread pointer (register or whatever it is) got
initialized. */
int l_tls_tp_initialized;
#endif #endif
}; };

View File

@ -4,7 +4,7 @@
/* Macros for accessing h_errno from inside libc. */ /* Macros for accessing h_errno from inside libc. */
# ifdef _LIBC_REENTRANT # ifdef _LIBC_REENTRANT
# include <tls.h> # include <tls.h>
# if USE_TLS && HAVE___THREAD # if USE___THREAD
# undef h_errno # undef h_errno
# define h_errno h_errno /* For #ifndef h_errno tests. */ # define h_errno h_errno /* For #ifndef h_errno tests. */
extern __thread int h_errno; extern __thread int h_errno;

View File

@ -14,7 +14,7 @@
# ifdef _LIBC_REENTRANT # ifdef _LIBC_REENTRANT
# include <tls.h> # include <tls.h>
# if USE_TLS && HAVE___THREAD # if USE___THREAD
# undef _res # undef _res
extern __thread struct __res_state _res; extern __thread struct __res_state _res;
# endif # endif

View File

@ -1,5 +1,5 @@
/* Macros for managing ABI-compatibility definitions using ELF symbol versions. /* 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. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -43,9 +43,14 @@
e.g. `#if SHLIB_COMPAT (libm, GLIBC_2_0, GLIBC_2_2)' for code introduced 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. */ in the GLIBC_2.0 version and obsoleted in the GLIBC_2.2 version. */
# define SHLIB_COMPAT(lib, introduced, obsoleted) \ # define SHLIB_COMPAT(lib, introduced, obsoleted) \
(!(ABI_##lib##_##obsoleted - 0) \ ((IS_IN_##lib - 0) \
|| ((ABI_##lib##_##introduced - 0) < (ABI_##lib##_##obsoleted - 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 /* 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 the version set name to use for e.g. symbols first introduced into

14
include/stubs-prologue.h Normal file
View File

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

14
include/tls.h Normal file
View File

@ -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

View 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 or unsorted array. There are other methods to organize information
which later should be searched. The costs of insert, delete and search which later should be searched. The costs of insert, delete and search
differ. One possible implementation is using hashing tables. 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 search.h
@comment SVID @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 The @code{tsearch} functions have the advantage that no function to
initialize data structures is necessary. A simple pointer of type initialize data structures is necessary. A simple pointer of type
@code{void *} initialized to @code{NULL} is a valid tree and can be @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 search.h
@comment SVID @comment SVID

View File

@ -180,7 +180,6 @@ xdrfunc *xdrfunc_head; /* xdr function list */
xdrfunc *xdrfunc_tail; /* xdr function list */ xdrfunc *xdrfunc_tail; /* xdr function list */
int int
__attribute__ ((noreturn))
main (int argc, const char *argv[]) main (int argc, const char *argv[])
{ {
struct commandline cmd; struct commandline cmd;
@ -248,8 +247,8 @@ main (int argc, const char *argv[])
mkfile_output (&cmd); mkfile_output (&cmd);
} }
} }
exit (nonfatalerrors);
/* NOTREACHED */ return nonfatalerrors;
} }
/* /*

View File

@ -51,7 +51,7 @@
We don't define an enum for the possible key values, because the KEYs We don't define an enum for the possible key values, because the KEYs
translate directly into variables by macro magic. */ 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_define(CLASS, KEY) CLASS __thread void *__libc_tsd_##KEY;
# define __libc_tsd_address(KEY) (&__libc_tsd_##KEY) # define __libc_tsd_address(KEY) (&__libc_tsd_##KEY)

View 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. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -16,20 +17,12 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */ 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 If 1, then an errno global variable hidden in ld.so will work right with
system (sysdeps/mips/elf/start.S) is also used by The Hurd. This file all the errno-using libc code compiled for ld.so, and there is never a
must not contain the definition of the `errno' variable, we have to need to share the errno location with libc. This is appropriate only if
define it somewhere else. 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. */ #define RTLD_PRIVATE_ERRNO 1
.bss
.globl errno
.type errno,@object
.size errno,4
errno: .word 4
.text
weak_alias(errno, _errno)
#include <sysdeps/unix/mips/sysdep.S>

View 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. Copyright (C) 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
@ -17,9 +17,16 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */ 02111-1307 USA. */
/* This special file is needed because some xstat64.c implementations #include <errno.h>
use versioning for __xstat64 and we need to keep it local to #include <tls.h>
the dynamic linker. */ #undef errno
#define RTLD_STAT64 #if USE___THREAD
#include <xstat64.c> __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

View File

@ -34,6 +34,7 @@
#include <sys/mman.h> #include <sys/mman.h>
#include <link.h> #include <link.h>
#include <dl-lookupcfg.h> #include <dl-lookupcfg.h>
#include <dl-sysdep.h>
#include <bits/libc-lock.h> #include <bits/libc-lock.h>
#include <hp-timing.h> #include <hp-timing.h>
#include <tls.h> #include <tls.h>
@ -372,6 +373,10 @@ struct rtld_global
/* Structure describing the dynamic linker itself. */ /* Structure describing the dynamic linker itself. */
EXTERN struct link_map _dl_rtld_map; EXTERN struct link_map _dl_rtld_map;
#ifdef _LIBC_REENTRANT
EXTERN void **(*_dl_error_catch_tsd) (void) __attribute__ ((const));
#endif
#ifdef SHARED #ifdef SHARED
}; };
# define __rtld_global_attribute__ # define __rtld_global_attribute__

View File

@ -11,6 +11,3 @@ int __data_start = 0;
#ifdef HAVE_WEAK_SYMBOLS #ifdef HAVE_WEAK_SYMBOLS
weak_alias (__data_start, data_start) weak_alias (__data_start, data_start)
#endif #endif
volatile int __errno;
strong_alias (__errno, errno)

View File

@ -299,7 +299,7 @@ _dl_start_user:\n\
define the value. define the value.
ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one 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. */ 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) \ # define elf_machine_type_class(type) \
((((type) == R_386_JMP_SLOT || (type) == R_386_TLS_DTPMOD32 \ ((((type) == R_386_JMP_SLOT || (type) == R_386_TLS_DTPMOD32 \
|| (type) == R_386_TLS_DTPOFF32 || (type) == R_386_TLS_TPOFF32 \ || (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; *reloc_addr = value;
break; break;
#ifdef USE_TLS #if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD)
case R_386_TLS_DTPMOD32: case R_386_TLS_DTPMOD32:
# ifdef RTLD_BOOTSTRAP # ifdef RTLD_BOOTSTRAP
/* During startup the dynamic linker is always the module /* During startup the dynamic linker is always the module

View File

@ -31,7 +31,7 @@ typedef struct
extern void *___tls_get_addr (tls_index *ti) extern void *___tls_get_addr (tls_index *ti)
__attribute__ ((__regparm__ (1))); __attribute__ ((__regparm__ (1)));
extern void *___tls_get_addr_internal (tls_index *ti) 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 /* The special thing about the x86 TLS ABI is that we have two
variants of the __tls_get_addr function with different calling variants of the __tls_get_addr function with different calling
@ -50,5 +50,5 @@ __tls_get_addr (tls_index *ti)
version of this file. */ version of this file. */
# define __tls_get_addr __attribute__ ((__regparm__ (1))) ___tls_get_addr # define __tls_get_addr __attribute__ ((__regparm__ (1))) ___tls_get_addr
strong_alias (___tls_get_addr, ___tls_get_addr_internal) 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 #endif

View 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. Copyright (C) 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
@ -17,9 +17,9 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */ 02111-1307 USA. */
/* This special file is needed because some fxstat64.c implementations /* The private errno doesn't make sense on the Hurd. errno is always the
use versioning for __fxstat64 and we need to keep it local to thread-local slot shared with libc, and it matters to share the cell
the dynamic linker. */ with libc because after startup we use libc functions that set errno
(open, mmap, etc). */
#define RTLD_STAT64 #define RTLD_PRIVATE_ERRNO 0
#include <fxstat64.c>

View File

@ -401,7 +401,7 @@ _dl_start_user:\n\
define the value. define the value.
ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one 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. */ 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) \ # define elf_machine_type_class(type) \
((((type) == R_SH_JMP_SLOT || (type) == R_SH_TLS_DTPMOD32 \ ((((type) == R_SH_JMP_SLOT || (type) == R_SH_TLS_DTPMOD32 \
|| (type) == R_SH_TLS_DTPOFF32 || (type) == R_SH_TLS_TPOFF32) \ || (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. */ /* These addresses are always aligned. */
*reloc_addr = value; *reloc_addr = value;
break; break;
#ifdef USE_TLS #if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD)
/* XXX Remove TLS relocations which are not needed. */ /* XXX Remove TLS relocations which are not needed. */
case R_SH_TLS_DTPMOD32: case R_SH_TLS_DTPMOD32:
# ifdef RTLD_BOOTSTRAP # ifdef RTLD_BOOTSTRAP

View File

@ -20,19 +20,6 @@
#include <sysdep.h> #include <sysdep.h>
#include <features.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 .text
.align 2 .align 2

View File

@ -28,11 +28,6 @@ int __data_start = 0;
weak_alias (__data_start, data_start) weak_alias (__data_start, data_start)
#endif #endif
#ifndef errno
volatile int __errno;
strong_alias (__errno, errno)
#endif
extern void __libc_init __P ((int argc, char **argv, char **envp)); extern void __libc_init __P ((int argc, char **argv, char **envp));
extern int main __P ((int argc, char **argv, char **envp)); extern int main __P ((int argc, char **argv, char **envp));

View File

@ -19,9 +19,6 @@
#include <sysdep.h> #include <sysdep.h>
__errno:
.comm errno, 4
ENTRY(__start) ENTRY(__start)
.set noreorder .set noreorder

View File

@ -23,6 +23,10 @@
#include <bp-asm.h> #include <bp-asm.h>
#include <bp-sym.h> #include <bp-sym.h>
#ifdef IS_IN_rtld
# include <dl-sysdep.h> /* Defines RTLD_PRIVATE_ERRNO. */
#endif
.globl C_SYMBOL_NAME(errno) .globl C_SYMBOL_NAME(errno)
.globl syscall_error .globl syscall_error
@ -42,7 +46,7 @@ syscall_error:
notb: notb:
#endif #endif
#ifndef PIC #ifndef PIC
# if USE_TLS && HAVE___THREAD # if USE___THREAD
movl %eax, %gs:C_SYMBOL_NAME(errno@NTPOFF) movl %eax, %gs:C_SYMBOL_NAME(errno@NTPOFF)
# elif !defined _LIBC_REENTRANT # elif !defined _LIBC_REENTRANT
movl %eax, C_SYMBOL_NAME(errno) movl %eax, C_SYMBOL_NAME(errno)
@ -57,12 +61,17 @@ notb:
#else #else
/* The caller has pushed %ebx and then set it up to /* The caller has pushed %ebx and then set it up to
point to the GOT before calling us through the PLT. */ 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 movl C_SYMBOL_NAME(errno@GOTNTPOFF)(%ebx), %ecx
/* Pop %ebx value saved before jumping here. */ /* Pop %ebx value saved before jumping here. */
popl %ebx popl %ebx
movl %eax, %gs:0(%ecx) 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 # elif !defined _LIBC_REENTRANT
movl C_SYMBOL_NAME(errno@GOT)(%ebx), %ecx movl C_SYMBOL_NAME(errno@GOT)(%ebx), %ecx

View File

@ -128,7 +128,8 @@ shared-only-routines += $file
;; ;;
*) *)
echo "\ echo "\
\$(foreach o,\$(object-suffixes),\$(objpfx)$file\$o): \\" \$(foreach o,\$(object-suffixes),\$(objpfx)$file\$o) \
\$(objpfx)rtld-$file.os: \\"
;; ;;
esac esac

View File

@ -39,10 +39,6 @@ int __data_start = 0;
weak_alias (__data_start, data_start) weak_alias (__data_start, data_start)
#endif #endif
VOLATILE int __errno;
strong_alias (__errno, errno)
extern void __libc_init __P ((int argc, char **argv, char **envp)); extern void __libc_init __P ((int argc, char **argv, char **envp));
extern int main __P ((int argc, char **argv, char **envp)); extern int main __P ((int argc, char **argv, char **envp));

View File

@ -35,13 +35,6 @@ weak_alias (__data_start, data_start)
#define DECL_DUMMIES #define DECL_DUMMIES
#endif #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 void __libc_init (int argc, char **argv, char **envp);
extern int main (int argc, char **argv, char **envp); extern int main (int argc, char **argv, char **envp);

View File

@ -27,9 +27,6 @@
/* The first piece of initialized data. */ /* The first piece of initialized data. */
int __data_start = 0; int __data_start = 0;
__volatile int __errno = 0;
strong_alias (__errno, errno)
extern void __libc_init __P ((int argc, char **argv, char **envp)); extern void __libc_init __P ((int argc, char **argv, char **envp));
extern int main __P ((int argc, char **argv, char **envp)); extern int main __P ((int argc, char **argv, char **envp));

View File

@ -18,13 +18,6 @@
#include <sysdep.h> #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 .text
/* The syscall stubs jump here when they detect an error. /* The syscall stubs jump here when they detect an error.

View File

@ -18,14 +18,6 @@
#include <sysdep.h> #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 /* The syscall stubs jump here when they detect an error, bot for PIC and
non-PIC. */ non-PIC. */

View File

@ -84,17 +84,14 @@ ___fxstat64 (int vers, int fd, struct stat64 *buf)
#endif #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); versioned_symbol (libc, ___fxstat64, __fxstat64, GLIBC_2_2);
# if SHLIB_COMPAT(libc, GLIBC_2_1, GLIBC_2_2)
strong_alias (___fxstat64, __old__fxstat64) strong_alias (___fxstat64, __old__fxstat64)
compat_symbol (libc, __old__fxstat64, __fxstat64, GLIBC_2_1); compat_symbol (libc, __old__fxstat64, __fxstat64, GLIBC_2_1);
# endif
#else
strong_alias (___fxstat64, __fxstat64);
#endif
hidden_ver (___fxstat64, __fxstat64) hidden_ver (___fxstat64, __fxstat64)
#else
strong_alias (___fxstat64, __fxstat64)
hidden_def (__fxstat64)
#endif

View File

@ -28,11 +28,6 @@ __syscall_error (int err_no)
return -1; 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 /* HPPA implements syscall() in 'C'; the assembler version would
typically be in syscall.S. */ typically be in syscall.S. */

View File

@ -17,29 +17,6 @@
02111-1307 USA. */ 02111-1307 USA. */
#include <sysdep.h> #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 /* The following code is only used in the shared library when we
compile the reentrant version. Otherwise each system call defines compile the reentrant version. Otherwise each system call defines

View File

@ -26,6 +26,12 @@
#include <bp-asm.h> #include <bp-asm.h>
#include <tls.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 /* For Linux we can use the system call table in the header file
/usr/include/asm/unistd.h /usr/include/asm/unistd.h
of the kernel. But these symbols do not follow the SYS_* syntax 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 call __i686.get_pc_thunk.reg
# endif # endif
/* Store (- %eax) into errno through the GOT. */ # if RTLD_PRIVATE_ERRNO
# ifdef _LIBC_REENTRANT # 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 \ # define SYSCALL_ERROR_HANDLER \
0:SETUP_PIC_REG (cx); \ 0:SETUP_PIC_REG (cx); \
addl $_GLOBAL_OFFSET_TABLE_, %ecx; \ addl $_GLOBAL_OFFSET_TABLE_, %ecx; \
@ -125,6 +140,7 @@ __i686.get_pc_thunk.reg: \
not modify the stack! */ not modify the stack! */
# endif # endif
# else # else
/* Store (- %eax) into errno through the GOT. */
# define SYSCALL_ERROR_HANDLER \ # define SYSCALL_ERROR_HANDLER \
0:SETUP_PIC_REG(cx); \ 0:SETUP_PIC_REG(cx); \
addl $_GLOBAL_OFFSET_TABLE_, %ecx; \ addl $_GLOBAL_OFFSET_TABLE_, %ecx; \
@ -273,6 +289,21 @@ asm (".L__X'%ebx = 1\n\t"
call. */ call. */
#undef INLINE_SYSCALL #undef INLINE_SYSCALL
#define INLINE_SYSCALL(name, nr, args...) \ #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; \ unsigned int resultvar; \
asm volatile ( \ asm volatile ( \
@ -282,11 +313,6 @@ asm (".L__X'%ebx = 1\n\t"
RESTOREARGS_##nr \ RESTOREARGS_##nr \
: "=a" (resultvar) \ : "=a" (resultvar) \
: "i" (__NR_##name) ASMFMT_##nr(args) : "memory", "cc"); \ : "i" (__NR_##name) ASMFMT_##nr(args) : "memory", "cc"); \
if (resultvar >= 0xfffff001) \
{ \
__set_errno (-resultvar); \
resultvar = 0xffffffff; \
} \
(int) resultvar; }) (int) resultvar; })
#define LOADARGS_0 #define LOADARGS_0

View File

@ -20,17 +20,6 @@
#include <sysdep.h> #include <sysdep.h>
#include <features.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) ENTRY(__syscall_error)
#ifdef _LIBC_REENTRANT #ifdef _LIBC_REENTRANT
.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(0) .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(0)

View File

@ -85,17 +85,14 @@ ___lxstat64 (int vers, const char *name, struct stat64 *buf)
#endif #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); versioned_symbol (libc, ___lxstat64, __lxstat64, GLIBC_2_2);
# if SHLIB_COMPAT(libc, GLIBC_2_1, GLIBC_2_2)
strong_alias (___lxstat64, __old__lxstat64) strong_alias (___lxstat64, __old__lxstat64)
compat_symbol (libc, __old__lxstat64, __lxstat64, GLIBC_2_1); compat_symbol (libc, __old__lxstat64, __lxstat64, GLIBC_2_1);
# endif hidden_ver (___lxstat64, __lxstat64)
#else #else
strong_alias (___lxstat64, __lxstat64); strong_alias (___lxstat64, __lxstat64);
hidden_def (__lxstat64)
#endif #endif
hidden_ver (___lxstat64, __lxstat64)

View File

@ -18,19 +18,6 @@
#include <sysdep.h> #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 /* The following code is only used in the shared library when we
compile the reentrant version. Otherwise each system call defines compile the reentrant version. Otherwise each system call defines

View File

@ -27,8 +27,3 @@ __syscall_error (int err_no)
__set_errno (err_no); __set_errno (err_no);
return -1; return -1;
} }
/* We also have to have a 'real' definition of errno. */
#undef errno
int errno = 0;
weak_alias (errno, _errno)

View File

@ -19,20 +19,6 @@
#include <sysdep.h> #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 /* The following code is only used in the shared library when we
compile the reentrant version. Otherwise each system call defines compile the reentrant version. Otherwise each system call defines
each own version. */ each own version. */

View File

@ -19,19 +19,6 @@
#include <sysdep.h> #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 /* The following code is only used in the shared library when we
compile the reentrant version. Otherwise each system call defines compile the reentrant version. Otherwise each system call defines

View File

@ -18,18 +18,6 @@
#include <sysdep.h> #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 syscall stubs jump here when they detect an error.
The code for Linux is almost identical to the canonical Unix The code for Linux is almost identical to the canonical Unix
code, except that the error number in R0 is negated. */ code, except that the error number in R0 is negated. */

View File

@ -1,30 +1 @@
/* Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc. /* Nothing to do here. */
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)

View File

@ -17,30 +17,6 @@
02111-1307 USA. */ 02111-1307 USA. */
#include <sysdep.h> #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 /* The following code is only used in the shared library when we
compile the reentrant version. Otherwise each system call defines compile the reentrant version. Otherwise each system call defines

View File

@ -24,6 +24,10 @@
#include <bp-sym.h> #include <bp-sym.h>
#include <bp-asm.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 /* For Linux we can use the system call table in the header file
/usr/include/asm/unistd.h /usr/include/asm/unistd.h
of the kernel. But these symbols do not follow the SYS_* syntax of the kernel. But these symbols do not follow the SYS_* syntax
@ -78,12 +82,18 @@
#ifndef PIC #ifndef PIC
#define SYSCALL_ERROR_HANDLER /* Nothing here; code in sysdep.S is used. */ #define SYSCALL_ERROR_HANDLER /* Nothing here; code in sysdep.S is used. */
#elif USE_TLS && HAVE___THREAD #elif USE___THREAD
# define SYSCALL_ERROR_HANDLER \ # define SYSCALL_ERROR_HANDLER \
movq errno@GOTTPOFF(%rip), %rcx; \ movq errno@GOTTPOFF(%rip), %rcx; \
xorq %rdx, %rdx; \ xorq %rdx, %rdx; \
subq %rax, %rdx; \ subq %rax, %rdx; \
movl %eax, %fs:0(%rcx) 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 #elif defined _LIBC_REENTRANT
/* Store (- %rax) into errno through the GOT. /* Store (- %rax) into errno through the GOT.
Note that errno occupies only 4 bytes. */ Note that errno occupies only 4 bytes. */

View File

@ -88,17 +88,15 @@ ___xstat64 (int vers, const char *name, struct stat64 *buf)
#endif #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, ___xstat64, __xstat64, GLIBC_2_2); versioned_symbol (libc, ___xstat64, __xstat64, GLIBC_2_2);
# if SHLIB_COMPAT(libc, GLIBC_2_1, GLIBC_2_2)
strong_alias (___xstat64, __old__xstat64) strong_alias (___xstat64, __old__xstat64)
compat_symbol (libc, __old__xstat64, __xstat64, GLIBC_2_1); compat_symbol (libc, __old__xstat64, __xstat64, GLIBC_2_1);
# endif
#else
strong_alias (___xstat64, __xstat64);
#endif
hidden_ver (___xstat64, __xstat64) hidden_ver (___xstat64, __xstat64)
#else
strong_alias (___xstat64, __xstat64)
hidden_def (__xstat64)
#endif

View File

@ -23,6 +23,10 @@
#include <bp-sym.h> #include <bp-sym.h>
#include <tls.h> #include <tls.h>
#ifdef IS_IN_rtld
# include <dl-sysdep.h> /* Defines RTLD_PRIVATE_ERRNO. */
#endif
.globl C_SYMBOL_NAME(errno) .globl C_SYMBOL_NAME(errno)
.globl syscall_error .globl syscall_error
@ -41,7 +45,7 @@ syscall_error:
movq $EAGAIN, %rax /* Yes; translate it to EAGAIN. */ movq $EAGAIN, %rax /* Yes; translate it to EAGAIN. */
notb: notb:
#endif #endif
#if USE_TLS && HAVE___THREAD #if USE___THREAD
# ifdef PIC # ifdef PIC
movq C_SYMBOL_NAME(errno@GOTTPOFF)(%rip), %rcx movq C_SYMBOL_NAME(errno@GOTTPOFF)(%rip), %rcx
movl %eax, %fs:0(%rcx) movl %eax, %fs:0(%rcx)
@ -60,7 +64,10 @@ notb:
movl %ecx, (%rax) movl %ecx, (%rax)
# endif # endif
#else #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 movq C_SYMBOL_NAME(errno)@GOTPCREL(%rip), %rcx
movl %eax, (%rcx) movl %eax, (%rcx)
# else # else

View File

@ -288,7 +288,7 @@ _dl_start_user:\n\
define the value. define the value.
ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one 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. */ 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) \ # define elf_machine_type_class(type) \
((((type) == R_X86_64_JUMP_SLOT \ ((((type) == R_X86_64_JUMP_SLOT \
|| (type) == R_X86_64_DTPMOD64 \ || (type) == R_X86_64_DTPMOD64 \
@ -389,7 +389,7 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
value += sym->st_value; value += sym->st_value;
#endif #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); assert (r_type == R_X86_64_GLOB_DAT || r_type == R_X86_64_JUMP_SLOT);
*reloc_addr = value + reloc->r_addend; *reloc_addr = value + reloc->r_addend;
#else #else