mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-21 20:40:05 +00:00
* 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:
parent
28654d2a06
commit
ce460d04a5
139
ChangeLog
139
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
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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 \
|
||||
|
54
elf/Makefile
54
elf/Makefile
@ -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)))
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
||||
|
54
elf/dl-tsd.c
Normal file
54
elf/dl-tsd.c
Normal 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
115
elf/rtld-Rules
Normal 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
|
83
elf/rtld.c
83
elf/rtld.c
@ -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
|
||||
|
||||
|
@ -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 */
|
||||
|
||||
|
@ -306,18 +306,12 @@
|
||||
# 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.
|
||||
|
||||
/* 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
|
||||
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 */
|
||||
|
2
include/gnu/stubs.h
Normal file
2
include/gnu/stubs.h
Normal 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. */
|
@ -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
|
||||
};
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
@ -43,9 +43,14 @@
|
||||
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
|
||||
|
14
include/stubs-prologue.h
Normal file
14
include/stubs-prologue.h
Normal 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
14
include/tls.h
Normal 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
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
@ -16,20 +17,12 @@
|
||||
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
|
@ -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.
|
||||
|
||||
@ -17,9 +17,16 @@
|
||||
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
|
@ -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__
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
@ -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
|
||||
|
@ -20,19 +20,6 @@
|
||||
#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
|
||||
|
||||
|
@ -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));
|
||||
|
||||
|
@ -19,9 +19,6 @@
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
__errno:
|
||||
.comm errno, 4
|
||||
|
||||
ENTRY(__start)
|
||||
.set noreorder
|
||||
|
||||
|
@ -23,6 +23,10 @@
|
||||
#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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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));
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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));
|
||||
|
||||
|
@ -18,13 +18,6 @@
|
||||
|
||||
#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.
|
||||
|
@ -18,14 +18,6 @@
|
||||
|
||||
#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. */
|
||||
|
||||
|
@ -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
|
||||
|
||||
#else
|
||||
strong_alias (___fxstat64, __fxstat64);
|
||||
#endif
|
||||
hidden_ver (___fxstat64, __fxstat64)
|
||||
#else
|
||||
strong_alias (___fxstat64, __fxstat64)
|
||||
hidden_def (__fxstat64)
|
||||
#endif
|
||||
|
@ -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. */
|
||||
|
@ -17,29 +17,6 @@
|
||||
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
|
||||
|
@ -26,6 +26,12 @@
|
||||
#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
|
||||
|
@ -20,17 +20,6 @@
|
||||
#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)
|
||||
|
@ -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)
|
||||
|
@ -18,19 +18,6 @@
|
||||
|
||||
#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
|
||||
|
@ -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)
|
||||
|
@ -19,20 +19,6 @@
|
||||
|
||||
#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. */
|
||||
|
@ -19,19 +19,6 @@
|
||||
|
||||
#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
|
||||
|
@ -18,18 +18,6 @@
|
||||
|
||||
#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. */
|
||||
|
@ -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. */
|
||||
|
@ -17,30 +17,6 @@
|
||||
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
|
||||
|
@ -24,6 +24,10 @@
|
||||
#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
|
||||
@ -78,12 +82,18 @@
|
||||
|
||||
#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. */
|
||||
|
@ -88,17 +88,15 @@ ___xstat64 (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, ___xstat64, __xstat64, GLIBC_2_2);
|
||||
|
||||
# if SHLIB_COMPAT(libc, GLIBC_2_1, GLIBC_2_2)
|
||||
strong_alias (___xstat64, __old__xstat64)
|
||||
compat_symbol (libc, __old__xstat64, __xstat64, GLIBC_2_1);
|
||||
# endif
|
||||
|
||||
#else
|
||||
strong_alias (___xstat64, __xstat64);
|
||||
#endif
|
||||
hidden_ver (___xstat64, __xstat64)
|
||||
#else
|
||||
strong_alias (___xstat64, __xstat64)
|
||||
hidden_def (__xstat64)
|
||||
#endif
|
||||
|
@ -23,6 +23,10 @@
|
||||
#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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user