mirror of git://sourceware.org/git/glibc.git
Updated to fedora-glibc-20061029T2155
This commit is contained in:
parent
48b752c9f6
commit
8dd5fcaca8
131
ChangeLog
131
ChangeLog
|
|
@ -1,18 +1,145 @@
|
|||
2006-10-29 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* po/sv.po: Update from translation team.
|
||||
|
||||
2006-10-29 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* elf/dl-sym.c (do_sym): Use RTLD_SINGLE_THREAD_P.
|
||||
* elf/dl-runtime.c (_dl_fixup, _dl_profile_fixup): Likewise.
|
||||
* elf/dl-close.c (_dl_close_worker): Likewise.
|
||||
* elf/dl-open.c (_dl_open_worker): Likewise.
|
||||
* sysdeps/generic/sysdep-cancel.h (RTLD_SINGLE_THREAD_P): Define.
|
||||
|
||||
2006-10-27 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* configure.in: Require assembler support for visibility, compiler
|
||||
support for visibility and aliases, linker support for various -z
|
||||
options.
|
||||
* Makeconfig: Remove conditional code which now is unnecessary.
|
||||
* config.h.in: Likewise.
|
||||
* config.make.in: Likewise.
|
||||
* dlfcn/Makefile: Likewise.
|
||||
* elf/Makefile: Likewise.
|
||||
* elf/dl-load.c: Likewise.
|
||||
* elf/rtld.c: Likewise.
|
||||
* include/libc-symbols.h: Likewise.
|
||||
* include/stdio.h: Likewise.
|
||||
* io/Makefile: Likewise.
|
||||
* io/fstat.c: Likewise.
|
||||
* io/fstat64.c: Likewise.
|
||||
* io/fstatat.c: Likewise.
|
||||
* io/fstatat64.c: Likewise.
|
||||
* io/lstat.c: Likewise.
|
||||
* io/lstat64.c: Likewise.
|
||||
* io/mknod.c: Likewise.
|
||||
* io/mknodat.c: Likewise.
|
||||
* io/stat.c: Likewise.
|
||||
* io/stat64.c: Likewise.
|
||||
* libio/stdio.c: Likewise.
|
||||
* nscd/Makefile: Likewise.
|
||||
* stdlib/Makefile: Likewise.
|
||||
* stdlib/atexit.c: Likewise.
|
||||
* sysdeps/generic/ldsodefs.h: Likewise.
|
||||
* sysdeps/i386/dl-machine.h: Likewise.
|
||||
* sysdeps/i386/sysdep.h: Likewise.
|
||||
* sysdeps/i386/i686/memcmp.S: Likewise.
|
||||
* sysdeps/powerpc/powerpc32/sysdep.h: Likewise.
|
||||
* sysdeps/unix/sysv/linux/i386/sigaction.c: Likewise.
|
||||
* sysdeps/unix/sysv/linux/x86_64/sigaction.c: Likewise.
|
||||
|
||||
* Makerules: USE_TLS support is now default.
|
||||
* tls.make.c: Likewise.
|
||||
* csu/Versions: Likewise.
|
||||
* csu/libc-start.c: Likewise.
|
||||
* csu/libc-tls.c: Likewise.
|
||||
* csu/version.c: Likewise.
|
||||
* dlfcn/dlinfo.c: Likewise.
|
||||
* elf/dl-addr.c: Likewise.
|
||||
* elf/dl-cache.c: Likewise.
|
||||
* elf/dl-close.c: Likewise.
|
||||
* elf/dl-iteratephdr.c: Likewise.
|
||||
* elf/dl-load.c: Likewise.
|
||||
* elf/dl-lookup.c: Likewise.
|
||||
* elf/dl-object.c: Likewise.
|
||||
* elf/dl-open.c: Likewise.
|
||||
* elf/dl-reloc.c: Likewise.
|
||||
* elf/dl-support.c: Likewise.
|
||||
* elf/dl-sym.c: Likewise.
|
||||
* elf/dl-sysdep.c: Likewise.
|
||||
* elf/dl-tls.c: Likewise.
|
||||
* elf/ldconfig.c: Likewise.
|
||||
* elf/rtld.c: Likewise.
|
||||
* elf/tst-tls-dlinfo.c: Likewise.
|
||||
* elf/tst-tls1.c: Likewise.
|
||||
* elf/tst-tls10.h: Likewise.
|
||||
* elf/tst-tls14.c: Likewise.
|
||||
* elf/tst-tls2.c: Likewise.
|
||||
* elf/tst-tls3.c: Likewise.
|
||||
* elf/tst-tls4.c: Likewise.
|
||||
* elf/tst-tls5.c: Likewise.
|
||||
* elf/tst-tls6.c: Likewise.
|
||||
* elf/tst-tls7.c: Likewise.
|
||||
* elf/tst-tls8.c: Likewise.
|
||||
* elf/tst-tls9.c: Likewise.
|
||||
* elf/tst-tlsmod1.c: Likewise.
|
||||
* elf/tst-tlsmod13.c: Likewise.
|
||||
* elf/tst-tlsmod13a.c: Likewise.
|
||||
* elf/tst-tlsmod14a.c: Likewise.
|
||||
* elf/tst-tlsmod2.c: Likewise.
|
||||
* elf/tst-tlsmod3.c: Likewise.
|
||||
* elf/tst-tlsmod4.c: Likewise.
|
||||
* elf/tst-tlsmod5.c: Likewise.
|
||||
* elf/tst-tlsmod6.c: Likewise.
|
||||
* include/errno.h: Likewise.
|
||||
* include/link.h: Likewise.
|
||||
* include/tls.h: Likewise.
|
||||
* locale/global-locale.c: Likewise.
|
||||
* locale/localeinfo.h: Likewise.
|
||||
* malloc/arena.c: Likewise.
|
||||
* malloc/hooks.c: Likewise.
|
||||
* malloc/malloc.c: Likewise.
|
||||
* resolv/Versions: Likewise.
|
||||
* sysdeps/alpha/dl-machine.h: Likewise.
|
||||
* sysdeps/alpha/libc-tls.c: Likewise.
|
||||
* sysdeps/generic/ldsodefs.h: Likewise.
|
||||
* sysdeps/generic/tls.h: Likewise.
|
||||
* sysdeps/i386/dl-machine.h: Likewise.
|
||||
* sysdeps/ia64/dl-machine.h: Likewise.
|
||||
* sysdeps/ia64/libc-tls.c: Likewise.
|
||||
* sysdeps/mach/hurd/fork.c: Likewise.
|
||||
* sysdeps/mach/hurd/i386/tls.h: Likewise.
|
||||
* sysdeps/powerpc/powerpc32/dl-machine.c: Likwise.
|
||||
* sysdeps/powerpc/powerpc32/dl-machine.h: Likewise.
|
||||
* sysdeps/powerpc/powerpc64/dl-machine.h: Likewise.
|
||||
* sysdeps/s390/libc-tls.c: Likewise.
|
||||
* sysdeps/s390/s390-32/dl-machine.h: Likewise.
|
||||
* sysdeps/s390/s390-64/dl-machine.h: Likewise.
|
||||
* sysdeps/sh/dl-machine.h: Likewise.
|
||||
* sysdeps/sparc/sparc32/dl-machine.h: Likewise.
|
||||
* sysdeps/sparc/sparc64/dl-machine.h: Likewise.
|
||||
* sysdeps/x86_64/dl-machine.h: Likewise.
|
||||
|
||||
* elf/dl-close.c (_dl_close_worker): Renamed from _dl_close and
|
||||
split out locking and parameter checking.
|
||||
(_dl_close): Call _dl_close_worker after locking and checking.
|
||||
* elf/dl-open.c (_dl_open): Call _dl_close_worker instead of
|
||||
_dl_close.
|
||||
* elf/Makefile: Add rules to build and run tst-thrlock.
|
||||
* elf/tst-thrlock.c: New file.
|
||||
|
||||
[BZ #3426]
|
||||
* stdlib/stdlib.h: Adjust comment for canonicalize_file_name to
|
||||
reality.
|
||||
|
||||
[BZ #3429]
|
||||
* elf/dl-open.c (dl_open_worker): Keep holding dl_load_lock until
|
||||
we are sure we do not need it anymore for _dl_close. ALso move
|
||||
we are sure we do not need it anymore for _dl_close. Also move
|
||||
the asserts inside the lock region.
|
||||
Patch mostly by Suzuki <suzuki@in.ibm.com>.
|
||||
|
||||
2006-10-27 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* elf/dl-lookup.c (_dl_debug_bindings): Remove unised symbol_scope
|
||||
* elf/dl-lookup.c (_dl_debug_bindings): Remove unused symbol_scope
|
||||
argument.
|
||||
(_dl_lookup_symbol_x): Adjust caller.
|
||||
|
||||
|
|
|
|||
|
|
@ -407,11 +407,9 @@ LDFLAGS.so += $(combreloc-LDFLAGS)
|
|||
LDFLAGS-rtld += $(combreloc-LDFLAGS)
|
||||
endif
|
||||
|
||||
ifeq (yes,$(have-z-relro))
|
||||
relro-LDFLAGS = -Wl,-z,relro
|
||||
LDFLAGS.so += $(relro-LDFLAGS)
|
||||
LDFLAGS-rtld += $(relro-LDFLAGS)
|
||||
endif
|
||||
|
||||
ifeq (yes,$(have-hash-style))
|
||||
# For the time being we unconditionally use 'both'. At some time we
|
||||
|
|
|
|||
|
|
@ -1233,10 +1233,7 @@ endif
|
|||
|
||||
ifeq ($(firstword $(sysd-sorted-done) f)$(firstword $(generating) f),tf)
|
||||
-include $(common-objpfx)tls.make
|
||||
config-tls := notls
|
||||
ifeq ($(use-tls),yes)
|
||||
config-tls := tls
|
||||
endif
|
||||
ifeq ($(use-thread),yes)
|
||||
config-tls := thread
|
||||
endif
|
||||
|
|
|
|||
20
config.h.in
20
config.h.in
|
|
@ -120,23 +120,6 @@
|
|||
/* Define if the linker supports the -z combreloc option. */
|
||||
#undef HAVE_Z_COMBRELOC
|
||||
|
||||
/* Define if the assembler supported .protected. */
|
||||
#undef HAVE_PROTECTED
|
||||
|
||||
/* Define if the assembler supported .hidden. */
|
||||
#undef HAVE_HIDDEN
|
||||
|
||||
/* Define if the compiler supports __attribute__ ((visibility (...))). */
|
||||
#undef HAVE_VISIBILITY_ATTRIBUTE
|
||||
|
||||
/* Define if the compiler doesn't support __attribute__ ((visibility (...)))
|
||||
together with __asm__ redirection properly. */
|
||||
#undef HAVE_BROKEN_VISIBILITY_ATTRIBUTE
|
||||
|
||||
/* Define if the compiler doesn't support __attribute__ ((alias (...)))
|
||||
together with __asm__ redirection properly. */
|
||||
#undef HAVE_BROKEN_ALIAS_ATTRIBUTE
|
||||
|
||||
/* Define if _rtld_local structure should be forced into .sdata section. */
|
||||
#undef HAVE_SDATA_SECTION
|
||||
|
||||
|
|
@ -188,9 +171,6 @@
|
|||
/* Defined if forced unwind support is available. */
|
||||
#undef HAVE_FORCED_UNWIND
|
||||
|
||||
/* Defined if the linker supports the -z relro option. */
|
||||
#undef HAVE_Z_RELRO
|
||||
|
||||
/* Defined of libidn is available. */
|
||||
#undef HAVE_LIBIDN
|
||||
|
||||
|
|
|
|||
|
|
@ -38,14 +38,9 @@ c++-sysincludes = @CXX_SYSINCLUDES@
|
|||
all-warnings = @all_warnings@
|
||||
|
||||
elf = @elf@
|
||||
have-protected = @libc_cv_asm_protected_directive@
|
||||
have-z-nodelete = @libc_cv_z_nodelete@
|
||||
have-z-nodlopen = @libc_cv_z_nodlopen@
|
||||
have-z-initfirst = @libc_cv_z_initfirst@
|
||||
have-z-combreloc = @libc_cv_z_combreloc@
|
||||
have-z-execstack = @libc_cv_z_execstack@
|
||||
have-initfini = @libc_cv_have_initfini@
|
||||
have-z-relro = @libc_cv_z_relro@
|
||||
have-Bgroup = @libc_cv_Bgroup@
|
||||
have-as-needed = @libc_cv_as_needed@
|
||||
libgcc_s_suffix = @libc_cv_libgcc_s_suffix@
|
||||
|
|
|
|||
|
|
@ -313,7 +313,7 @@ ac_includes_default="\
|
|||
# include <unistd.h>
|
||||
#endif"
|
||||
|
||||
ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS with_fp with_cvs enable_check_abi oldest_abi bindnow force_install all_warnings build build_cpu build_vendor build_os host host_cpu host_vendor host_os subdirs add_ons add_on_subdirs base_machine submachine sysnames sysdeps_add_ons INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA LN_S CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC OBJEXT BUILD_CC cross_compiling CPP CXX CXXFLAGS ac_ct_CXX AR OBJDUMP RANLIB ac_ct_RANLIB MIG AS LD PWD_P MAKE MSGFMT MAKEINFO SED AUTOCONF SYSINCLUDES CXX_SYSINCLUDES libc_cv_gcc_static_libgcc BASH libc_cv_have_bash2 KSH libc_cv_have_ksh AWK PERL INSTALL_INFO BISON VERSIONING libc_cv_asm_protected_directive libc_cv_cc_with_libunwind libc_cv_z_nodelete libc_cv_z_nodlopen libc_cv_z_initfirst libc_cv_z_relro libc_cv_Bgroup libc_cv_libgcc_s_suffix libc_cv_as_needed ASFLAGS_config libc_cv_z_combreloc libc_cv_z_execstack libc_cv_fpie libc_cv_hashstyle fno_unit_at_a_time libc_cv_ssp libc_cv_have_initfini no_whole_archive exceptions LIBGD have_libaudit have_libcap have_selinux EGREP sizeof_long_double libc_cv_gcc_unwind_find_fde uname_sysname uname_release uname_version old_glibc_headers libc_cv_slibdir libc_cv_localedir libc_cv_sysconfdir libc_cv_rootsbindir libc_cv_forced_unwind use_ldconfig ldd_rewrite_script elf xcoff static shared pic_default profile omitfp bounded static_nss nopic_initfini DEFINES mach_interface_list VERSION RELEASE LIBOBJS LTLIBOBJS'
|
||||
ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS with_fp with_cvs enable_check_abi oldest_abi bindnow force_install all_warnings build build_cpu build_vendor build_os host host_cpu host_vendor host_os subdirs add_ons add_on_subdirs base_machine submachine sysnames sysdeps_add_ons INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA LN_S CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC OBJEXT BUILD_CC cross_compiling CPP CXX CXXFLAGS ac_ct_CXX AR OBJDUMP RANLIB ac_ct_RANLIB MIG AS LD PWD_P MAKE MSGFMT MAKEINFO SED AUTOCONF SYSINCLUDES CXX_SYSINCLUDES libc_cv_gcc_static_libgcc BASH libc_cv_have_bash2 KSH libc_cv_have_ksh AWK PERL INSTALL_INFO BISON VERSIONING libc_cv_cc_with_libunwind libc_cv_Bgroup libc_cv_libgcc_s_suffix libc_cv_as_needed ASFLAGS_config libc_cv_z_combreloc libc_cv_z_execstack libc_cv_fpie libc_cv_hashstyle fno_unit_at_a_time libc_cv_ssp libc_cv_have_initfini no_whole_archive exceptions LIBGD have_libaudit have_libcap have_selinux EGREP sizeof_long_double libc_cv_gcc_unwind_find_fde uname_sysname uname_release uname_version old_glibc_headers libc_cv_slibdir libc_cv_localedir libc_cv_sysconfdir libc_cv_rootsbindir libc_cv_forced_unwind use_ldconfig ldd_rewrite_script elf xcoff static shared pic_default profile omitfp bounded static_nss nopic_initfini DEFINES mach_interface_list VERSION RELEASE LIBOBJS LTLIBOBJS'
|
||||
ac_subst_files=''
|
||||
|
||||
# Initialize some variables set by options.
|
||||
|
|
@ -5339,22 +5339,15 @@ EOF
|
|||
(exit $ac_status); }; }; then
|
||||
libc_cv_asm_protected_directive=yes
|
||||
else
|
||||
libc_cv_asm_protected_directive=no
|
||||
{ { echo "$as_me:$LINENO: error: assembler support for symbol visibility is required" >&5
|
||||
echo "$as_me: error: assembler support for symbol visibility is required" >&2;}
|
||||
{ (exit 1); exit 1; }; }
|
||||
fi
|
||||
rm -f conftest*
|
||||
fi
|
||||
echo "$as_me:$LINENO: result: $libc_cv_asm_protected_directive" >&5
|
||||
echo "${ECHO_T}$libc_cv_asm_protected_directive" >&6
|
||||
|
||||
cat >>confdefs.h <<\_ACEOF
|
||||
#define HAVE_PROTECTED 1
|
||||
_ACEOF
|
||||
|
||||
cat >>confdefs.h <<\_ACEOF
|
||||
#define HAVE_HIDDEN 1
|
||||
_ACEOF
|
||||
|
||||
|
||||
if test $libc_cv_asm_protected_directive = yes; then
|
||||
echo "$as_me:$LINENO: checking whether __attribute__((visibility())) is supported" >&5
|
||||
echo $ECHO_N "checking whether __attribute__((visibility())) is supported... $ECHO_C" >&6
|
||||
|
|
@ -5383,11 +5376,10 @@ EOF
|
|||
fi
|
||||
echo "$as_me:$LINENO: result: $libc_cv_visibility_attribute" >&5
|
||||
echo "${ECHO_T}$libc_cv_visibility_attribute" >&6
|
||||
if test $libc_cv_visibility_attribute = yes; then
|
||||
cat >>confdefs.h <<\_ACEOF
|
||||
#define HAVE_VISIBILITY_ATTRIBUTE 1
|
||||
_ACEOF
|
||||
|
||||
if test $libc_cv_visibility_attribute != yes; then
|
||||
{ { echo "$as_me:$LINENO: error: compiler support for visibility attribute is required" >&5
|
||||
echo "$as_me: error: compiler support for visibility attribute is required" >&2;}
|
||||
{ (exit 1); exit 1; }; }
|
||||
fi
|
||||
fi
|
||||
|
||||
|
|
@ -5419,10 +5411,9 @@ fi
|
|||
echo "$as_me:$LINENO: result: $libc_cv_broken_visibility_attribute" >&5
|
||||
echo "${ECHO_T}$libc_cv_broken_visibility_attribute" >&6
|
||||
if test $libc_cv_broken_visibility_attribute = yes; then
|
||||
cat >>confdefs.h <<\_ACEOF
|
||||
#define HAVE_BROKEN_VISIBILITY_ATTRIBUTE 1
|
||||
_ACEOF
|
||||
|
||||
{ { echo "$as_me:$LINENO: error: working compiler support for visibility attribute is required" >&5
|
||||
echo "$as_me: error: working compiler support for visibility attribute is required" >&2;}
|
||||
{ (exit 1); exit 1; }; }
|
||||
fi
|
||||
fi
|
||||
|
||||
|
|
@ -5457,10 +5448,9 @@ fi
|
|||
echo "$as_me:$LINENO: result: $libc_cv_broken_alias_attribute" >&5
|
||||
echo "${ECHO_T}$libc_cv_broken_alias_attribute" >&6
|
||||
if test $libc_cv_broken_alias_attribute = yes; then
|
||||
cat >>confdefs.h <<\_ACEOF
|
||||
#define HAVE_BROKEN_ALIAS_ATTRIBUTE 1
|
||||
_ACEOF
|
||||
|
||||
{ { echo "$as_me:$LINENO: error: working alias attribute support required" >&5
|
||||
echo "$as_me: error: working alias attribute support required" >&2;}
|
||||
{ (exit 1); exit 1; }; }
|
||||
fi
|
||||
|
||||
if test $libc_cv_visibility_attribute = yes; then
|
||||
|
|
@ -5572,14 +5562,15 @@ EOF
|
|||
then
|
||||
libc_cv_z_nodelete=yes
|
||||
else
|
||||
libc_cv_z_nodelete=no
|
||||
{ { echo "$as_me:$LINENO: error: linker with -z nodelete support required" >&5
|
||||
echo "$as_me: error: linker with -z nodelete support required" >&2;}
|
||||
{ (exit 1); exit 1; }; }
|
||||
fi
|
||||
rm -f conftest*
|
||||
fi
|
||||
echo "$as_me:$LINENO: result: $libc_cv_z_nodelete" >&5
|
||||
echo "${ECHO_T}$libc_cv_z_nodelete" >&6
|
||||
|
||||
|
||||
echo "$as_me:$LINENO: checking for -z nodlopen option" >&5
|
||||
echo $ECHO_N "checking for -z nodlopen option... $ECHO_C" >&6
|
||||
if test "${libc_cv_z_nodlopen+set}" = set; then
|
||||
|
|
@ -5600,14 +5591,15 @@ EOF
|
|||
then
|
||||
libc_cv_z_nodlopen=yes
|
||||
else
|
||||
libc_cv_z_nodlopen=no
|
||||
{ { echo "$as_me:$LINENO: error: linker with -z nodlopen support required" >&5
|
||||
echo "$as_me: error: linker with -z nodlopen support required" >&2;}
|
||||
{ (exit 1); exit 1; }; }
|
||||
fi
|
||||
rm -f conftest*
|
||||
fi
|
||||
echo "$as_me:$LINENO: result: $libc_cv_z_nodlopen" >&5
|
||||
echo "${ECHO_T}$libc_cv_z_nodlopen" >&6
|
||||
|
||||
|
||||
echo "$as_me:$LINENO: checking for -z initfirst option" >&5
|
||||
echo $ECHO_N "checking for -z initfirst option... $ECHO_C" >&6
|
||||
if test "${libc_cv_z_initfirst+set}" = set; then
|
||||
|
|
@ -5628,14 +5620,15 @@ EOF
|
|||
then
|
||||
libc_cv_z_initfirst=yes
|
||||
else
|
||||
libc_cv_z_initfirst=no
|
||||
{ { echo "$as_me:$LINENO: error: linker with -z initfirst support required" >&5
|
||||
echo "$as_me: error: linker with -z initfirst support required" >&2;}
|
||||
{ (exit 1); exit 1; }; }
|
||||
fi
|
||||
rm -f conftest*
|
||||
fi
|
||||
echo "$as_me:$LINENO: result: $libc_cv_z_initfirst" >&5
|
||||
echo "${ECHO_T}$libc_cv_z_initfirst" >&6
|
||||
|
||||
|
||||
echo "$as_me:$LINENO: checking for -z relro option" >&5
|
||||
echo $ECHO_N "checking for -z relro option... $ECHO_C" >&6
|
||||
if test "${libc_cv_z_relro+set}" = set; then
|
||||
|
|
@ -5662,12 +5655,10 @@ else
|
|||
fi
|
||||
echo "$as_me:$LINENO: result: $libc_cv_z_relro" >&5
|
||||
echo "${ECHO_T}$libc_cv_z_relro" >&6
|
||||
|
||||
if test $libc_cv_z_relro = yes; then
|
||||
cat >>confdefs.h <<\_ACEOF
|
||||
#define HAVE_Z_RELRO 1
|
||||
_ACEOF
|
||||
|
||||
if test $libc_cv_z_relro != yes; then
|
||||
{ { echo "$as_me:$LINENO: error: linker with -z relro support required" >&5
|
||||
echo "$as_me: error: linker with -z relro support required" >&2;}
|
||||
{ (exit 1); exit 1; }; }
|
||||
fi
|
||||
|
||||
echo "$as_me:$LINENO: checking for -Bgroup option" >&5
|
||||
|
|
@ -8510,12 +8501,7 @@ s,@PERL@,$PERL,;t t
|
|||
s,@INSTALL_INFO@,$INSTALL_INFO,;t t
|
||||
s,@BISON@,$BISON,;t t
|
||||
s,@VERSIONING@,$VERSIONING,;t t
|
||||
s,@libc_cv_asm_protected_directive@,$libc_cv_asm_protected_directive,;t t
|
||||
s,@libc_cv_cc_with_libunwind@,$libc_cv_cc_with_libunwind,;t t
|
||||
s,@libc_cv_z_nodelete@,$libc_cv_z_nodelete,;t t
|
||||
s,@libc_cv_z_nodlopen@,$libc_cv_z_nodlopen,;t t
|
||||
s,@libc_cv_z_initfirst@,$libc_cv_z_initfirst,;t t
|
||||
s,@libc_cv_z_relro@,$libc_cv_z_relro,;t t
|
||||
s,@libc_cv_Bgroup@,$libc_cv_Bgroup,;t t
|
||||
s,@libc_cv_libgcc_s_suffix@,$libc_cv_libgcc_s_suffix,;t t
|
||||
s,@libc_cv_as_needed@,$libc_cv_as_needed,;t t
|
||||
|
|
|
|||
27
configure.in
27
configure.in
|
|
@ -1259,12 +1259,9 @@ EOF
|
|||
if AC_TRY_COMMAND(${CC-cc} -c $ASFLAGS conftest.s 1>&AS_MESSAGE_LOG_FD); then
|
||||
libc_cv_asm_protected_directive=yes
|
||||
else
|
||||
libc_cv_asm_protected_directive=no
|
||||
AC_MSG_ERROR(assembler support for symbol visibility is required)
|
||||
fi
|
||||
rm -f conftest*])
|
||||
AC_SUBST(libc_cv_asm_protected_directive)
|
||||
AC_DEFINE(HAVE_PROTECTED)
|
||||
AC_DEFINE(HAVE_HIDDEN)
|
||||
|
||||
if test $libc_cv_asm_protected_directive = yes; then
|
||||
AC_CACHE_CHECK(whether __attribute__((visibility())) is supported,
|
||||
|
|
@ -1283,8 +1280,8 @@ EOF
|
|||
fi
|
||||
rm -f conftest.[cs]
|
||||
])
|
||||
if test $libc_cv_visibility_attribute = yes; then
|
||||
AC_DEFINE(HAVE_VISIBILITY_ATTRIBUTE)
|
||||
if test $libc_cv_visibility_attribute != yes; then
|
||||
AC_MSG_ERROR(compiler support for visibility attribute is required)
|
||||
fi
|
||||
fi
|
||||
|
||||
|
|
@ -1307,7 +1304,7 @@ changequote([,])dnl
|
|||
rm -f conftest.c conftest.s
|
||||
])
|
||||
if test $libc_cv_broken_visibility_attribute = yes; then
|
||||
AC_DEFINE(HAVE_BROKEN_VISIBILITY_ATTRIBUTE)
|
||||
AC_MSG_ERROR(working compiler support for visibility attribute is required)
|
||||
fi
|
||||
fi
|
||||
|
||||
|
|
@ -1331,7 +1328,7 @@ EOF
|
|||
rm -f conftest.c conftest.s
|
||||
])
|
||||
if test $libc_cv_broken_alias_attribute = yes; then
|
||||
AC_DEFINE(HAVE_BROKEN_ALIAS_ATTRIBUTE)
|
||||
AC_MSG_ERROR(working alias attribute support required)
|
||||
fi
|
||||
|
||||
if test $libc_cv_visibility_attribute = yes; then
|
||||
|
|
@ -1403,10 +1400,9 @@ EOF
|
|||
then
|
||||
libc_cv_z_nodelete=yes
|
||||
else
|
||||
libc_cv_z_nodelete=no
|
||||
AC_MSG_ERROR(linker with -z nodelete support required)
|
||||
fi
|
||||
rm -f conftest*])
|
||||
AC_SUBST(libc_cv_z_nodelete)
|
||||
|
||||
AC_CACHE_CHECK(for -z nodlopen option,
|
||||
libc_cv_z_nodlopen, [dnl
|
||||
|
|
@ -1420,10 +1416,9 @@ EOF
|
|||
then
|
||||
libc_cv_z_nodlopen=yes
|
||||
else
|
||||
libc_cv_z_nodlopen=no
|
||||
AC_MSG_ERROR(linker with -z nodlopen support required)
|
||||
fi
|
||||
rm -f conftest*])
|
||||
AC_SUBST(libc_cv_z_nodlopen)
|
||||
|
||||
AC_CACHE_CHECK(for -z initfirst option,
|
||||
libc_cv_z_initfirst, [dnl
|
||||
|
|
@ -1437,10 +1432,9 @@ EOF
|
|||
then
|
||||
libc_cv_z_initfirst=yes
|
||||
else
|
||||
libc_cv_z_initfirst=no
|
||||
AC_MSG_ERROR(linker with -z initfirst support required)
|
||||
fi
|
||||
rm -f conftest*])
|
||||
AC_SUBST(libc_cv_z_initfirst)
|
||||
|
||||
AC_CACHE_CHECK(for -z relro option,
|
||||
libc_cv_z_relro, [dnl
|
||||
|
|
@ -1452,9 +1446,8 @@ EOF
|
|||
libc_cv_z_relro=yes
|
||||
fi
|
||||
fi])
|
||||
AC_SUBST(libc_cv_z_relro)
|
||||
if test $libc_cv_z_relro = yes; then
|
||||
AC_DEFINE(HAVE_Z_RELRO)
|
||||
if test $libc_cv_z_relro != yes; then
|
||||
AC_MSG_ERROR(linker with -z relro support required)
|
||||
fi
|
||||
|
||||
AC_CACHE_CHECK(for -Bgroup option,
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ libc {
|
|||
# helper functions
|
||||
__libc_init_first; __libc_start_main;
|
||||
|
||||
%if !(USE_TLS && HAVE___THREAD)
|
||||
%if !HAVE___THREAD
|
||||
# global variables
|
||||
_errno;
|
||||
|
||||
|
|
@ -18,7 +18,7 @@ libc {
|
|||
gnu_get_libc_release; gnu_get_libc_version;
|
||||
}
|
||||
GLIBC_PRIVATE {
|
||||
%if USE_TLS && HAVE___THREAD
|
||||
%if HAVE___THREAD
|
||||
# This version is for the TLS symbol, GLIBC_2.0 is the old object symbol.
|
||||
errno;
|
||||
%endif
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (C) 1998-2003, 2004, 2005 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1998-2003, 2004, 2005, 2006 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
|
||||
|
|
@ -30,11 +30,7 @@ extern int __libc_multiple_libcs;
|
|||
#include <tls.h>
|
||||
#ifndef SHARED
|
||||
# include <dl-osinfo.h>
|
||||
extern void __pthread_initialize_minimal (void)
|
||||
# if !(USE_TLS - 0) && !defined NONTLS_INIT_TP
|
||||
__attribute__ ((weak))
|
||||
# endif
|
||||
;
|
||||
extern void __pthread_initialize_minimal (void);
|
||||
# ifndef THREAD_SET_STACK_GUARD
|
||||
/* Only exported for architectures that don't store the stack guard canary
|
||||
in thread local area. */
|
||||
|
|
@ -140,13 +136,8 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL),
|
|||
|
||||
/* Initialize the thread library at least a bit since the libgcc
|
||||
functions are using thread functions if these are available and
|
||||
we need to setup errno. If there is no thread library and we
|
||||
handle TLS the function is defined in the libc to initialized the
|
||||
TLS handling. */
|
||||
# if !(USE_TLS - 0) && !defined NONTLS_INIT_TP
|
||||
if (__pthread_initialize_minimal)
|
||||
# endif
|
||||
__pthread_initialize_minimal ();
|
||||
we need to setup errno. */
|
||||
__pthread_initialize_minimal ();
|
||||
#endif
|
||||
|
||||
# ifndef SHARED
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/* Initialization code for TLS in statically linked application.
|
||||
Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
|
||||
Copyright (C) 2002, 2003, 2004, 2005, 2006 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
|
||||
|
|
@ -29,7 +29,6 @@
|
|||
#error makefile bug, this file is for static only
|
||||
#endif
|
||||
|
||||
#ifdef USE_TLS
|
||||
extern ElfW(Phdr) *_dl_phdr;
|
||||
extern size_t _dl_phnum;
|
||||
|
||||
|
|
@ -143,19 +142,19 @@ __libc_setup_tls (size_t tcbsize, size_t tcbalign)
|
|||
The initialized value of _dl_tls_static_size is provided by dl-open.c
|
||||
to request some surplus that permits dynamic loading of modules with
|
||||
IE-model TLS. */
|
||||
# if TLS_TCB_AT_TP
|
||||
#if TLS_TCB_AT_TP
|
||||
tcb_offset = roundup (memsz + GL(dl_tls_static_size), tcbalign);
|
||||
tlsblock = __sbrk (tcb_offset + tcbsize + max_align);
|
||||
# elif TLS_DTV_AT_TP
|
||||
#elif TLS_DTV_AT_TP
|
||||
tcb_offset = roundup (tcbsize, align ?: 1);
|
||||
tlsblock = __sbrk (tcb_offset + memsz + max_align
|
||||
+ TLS_PRE_TCB_SIZE + GL(dl_tls_static_size));
|
||||
tlsblock += TLS_PRE_TCB_SIZE;
|
||||
# else
|
||||
#else
|
||||
/* In case a model with a different layout for the TCB and DTV
|
||||
is defined add another #elif here and in the following #ifs. */
|
||||
# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
|
||||
# endif
|
||||
# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
|
||||
#endif
|
||||
|
||||
/* Align the TLS block. */
|
||||
tlsblock = (void *) (((uintptr_t) tlsblock + max_align - 1)
|
||||
|
|
@ -166,16 +165,16 @@ __libc_setup_tls (size_t tcbsize, size_t tcbalign)
|
|||
// static_dtv[1].counter = 0; would be needed if not already done
|
||||
|
||||
/* Initialize the TLS block. */
|
||||
# if TLS_TCB_AT_TP
|
||||
#if TLS_TCB_AT_TP
|
||||
static_dtv[2].pointer.val = ((char *) tlsblock + tcb_offset
|
||||
- roundup (memsz, align ?: 1));
|
||||
static_map.l_tls_offset = roundup (memsz, align ?: 1);
|
||||
# elif TLS_DTV_AT_TP
|
||||
#elif TLS_DTV_AT_TP
|
||||
static_dtv[2].pointer.val = (char *) tlsblock + tcb_offset;
|
||||
static_map.l_tls_offset = tcb_offset;
|
||||
# else
|
||||
# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
|
||||
# endif
|
||||
#else
|
||||
# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
|
||||
#endif
|
||||
static_dtv[2].pointer.is_static = true;
|
||||
/* sbrk gives us zero'd memory, so we don't need to clear the remainder. */
|
||||
memcpy (static_dtv[2].pointer.val, initimage, filesz);
|
||||
|
|
@ -183,16 +182,16 @@ __libc_setup_tls (size_t tcbsize, size_t tcbalign)
|
|||
/* Install the pointer to the dtv. */
|
||||
|
||||
/* Initialize the thread pointer. */
|
||||
# if TLS_TCB_AT_TP
|
||||
#if TLS_TCB_AT_TP
|
||||
INSTALL_DTV ((char *) tlsblock + tcb_offset, static_dtv);
|
||||
|
||||
const char *lossage = TLS_INIT_TP ((char *) tlsblock + tcb_offset, 0);
|
||||
# elif TLS_DTV_AT_TP
|
||||
#elif TLS_DTV_AT_TP
|
||||
INSTALL_DTV (tlsblock, static_dtv);
|
||||
const char *lossage = TLS_INIT_TP (tlsblock, 0);
|
||||
# else
|
||||
# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
|
||||
# endif
|
||||
#else
|
||||
# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
|
||||
#endif
|
||||
if (__builtin_expect (lossage != NULL, 0))
|
||||
__libc_fatal (lossage);
|
||||
|
||||
|
|
@ -212,11 +211,11 @@ __libc_setup_tls (size_t tcbsize, size_t tcbalign)
|
|||
|
||||
memsz = roundup (memsz, align ?: 1);
|
||||
|
||||
# if TLS_TCB_AT_TP
|
||||
#if TLS_TCB_AT_TP
|
||||
memsz += tcbsize;
|
||||
# elif TLS_DTV_AT_TP
|
||||
#elif TLS_DTV_AT_TP
|
||||
memsz += tcb_offset;
|
||||
# endif
|
||||
#endif
|
||||
|
||||
init_static_tls (memsz, MAX (TLS_TCB_ALIGN, max_align));
|
||||
}
|
||||
|
|
@ -230,11 +229,11 @@ _dl_tls_setup (void)
|
|||
{
|
||||
init_slotinfo ();
|
||||
init_static_tls (
|
||||
# if TLS_TCB_AT_TP
|
||||
#if TLS_TCB_AT_TP
|
||||
TLS_TCB_SIZE,
|
||||
# else
|
||||
#else
|
||||
0,
|
||||
# endif
|
||||
#endif
|
||||
TLS_TCB_ALIGN);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -248,16 +247,3 @@ __pthread_initialize_minimal (void)
|
|||
{
|
||||
__libc_setup_tls (TLS_INIT_TCB_SIZE, TLS_INIT_TCB_ALIGN);
|
||||
}
|
||||
|
||||
#elif defined NONTLS_INIT_TP
|
||||
|
||||
/* This is the minimal initialization function used when libpthread is
|
||||
not used. */
|
||||
void
|
||||
__attribute__ ((weak))
|
||||
__pthread_initialize_minimal (void)
|
||||
{
|
||||
NONTLS_INIT_TP;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -34,9 +34,6 @@ Compiled by GNU CC version "__VERSION__".\n"
|
|||
#ifdef GLIBC_OLDEST_ABI
|
||||
"The oldest ABI supported: " GLIBC_OLDEST_ABI ".\n"
|
||||
#endif
|
||||
#ifdef USE_TLS
|
||||
"Thread-local storage support included.\n"
|
||||
#endif
|
||||
"For bug reporting instructions, please see:\n\
|
||||
<http://www.gnu.org/software/libc/bugs.html>.\n";
|
||||
|
||||
|
|
|
|||
|
|
@ -41,10 +41,7 @@ endif
|
|||
ifeq (yes,$(build-shared))
|
||||
tests = glrefmain failtest tst-dladdr default errmsg1 tstcxaatexit \
|
||||
bug-dlopen1 bug-dlsym1 tst-dlinfo bug-atexit1 bug-atexit2 \
|
||||
bug-atexit3
|
||||
ifeq (yes,$(have-protected))
|
||||
tests += tstatexit
|
||||
endif
|
||||
bug-atexit3 tstatexit
|
||||
endif
|
||||
modules-names = glreflib1 glreflib2 failtestmod defaultmod1 defaultmod2 \
|
||||
errmsg1mod modatexit modcxaatexit \
|
||||
|
|
|
|||
|
|
@ -32,9 +32,7 @@ dlinfo (void *handle, int request, void *arg)
|
|||
|
||||
#else
|
||||
|
||||
# ifdef USE_TLS
|
||||
# include <dl-tls.h>
|
||||
# endif
|
||||
# include <dl-tls.h>
|
||||
|
||||
struct dlinfo_args
|
||||
{
|
||||
|
|
@ -97,18 +95,14 @@ RTLD_SELF used in code not dynamically loaded"));
|
|||
|
||||
case RTLD_DI_TLS_MODID:
|
||||
*(size_t *) args->arg = 0;
|
||||
#ifdef USE_TLS
|
||||
*(size_t *) args->arg = l->l_tls_modid;
|
||||
#endif
|
||||
break;
|
||||
|
||||
case RTLD_DI_TLS_DATA:
|
||||
{
|
||||
void *data = NULL;
|
||||
#ifdef USE_TLS
|
||||
if (l->l_tls_modid != 0)
|
||||
data = _dl_tls_get_addr_soft (l);
|
||||
#endif
|
||||
*(void **) args->arg = data;
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
18
elf/Makefile
18
elf/Makefile
|
|
@ -159,8 +159,8 @@ endif
|
|||
ifeq (yes,$(build-shared))
|
||||
tests += loadtest restest1 preloadtest loadfail multiload origtest resolvfail \
|
||||
constload1 order $(tests-vis-$(have-protected)) noload filter unload \
|
||||
reldep reldep2 reldep3 reldep4 $(tests-nodelete-$(have-z-nodelete)) \
|
||||
$(tests-nodlopen-$(have-z-nodlopen)) neededtest neededtest2 \
|
||||
reldep reldep2 reldep3 reldep4 nodelete nodelete2 \
|
||||
nodlopen nodlopen2 neededtest neededtest2 \
|
||||
neededtest3 neededtest4 unload2 lateglobal initfirst global \
|
||||
restest2 next dblload dblunload reldep5 reldep6 reldep7 reldep8 \
|
||||
circleload1 tst-tls3 tst-tls4 tst-tls5 tst-tls6 tst-tls7 tst-tls8 \
|
||||
|
|
@ -171,12 +171,10 @@ tests += loadtest restest1 preloadtest loadfail multiload origtest resolvfail \
|
|||
tst-dlmopen1 tst-dlmopen2 tst-dlmopen3 \
|
||||
unload3 unload4 unload5 unload6 unload7 tst-global1 order2 \
|
||||
tst-audit1 tst-audit2 \
|
||||
tst-stackguard1 tst-addr1
|
||||
tst-stackguard1 tst-addr1 tst-thrlock
|
||||
# reldep9
|
||||
test-srcs = tst-pathopt
|
||||
tests-vis-yes = vismain
|
||||
tests-nodelete-yes = nodelete nodelete2
|
||||
tests-nodlopen-yes = nodlopen nodlopen2
|
||||
tests-execstack-yes = tst-execstack tst-execstack-needed tst-execstack-prog
|
||||
endif
|
||||
ifeq (yesyes,$(have-fpie)$(build-shared))
|
||||
|
|
@ -186,8 +184,9 @@ tests: $(objpfx)tst-leaks1-mem
|
|||
modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
|
||||
testobj1_1 failobj constload2 constload3 unloadmod \
|
||||
dep1 dep2 dep3 dep4 $(modules-vis-$(have-protected)) \
|
||||
$(modules-nodelete-$(have-z-nodelete)) \
|
||||
$(modules-nodlopen-$(have-z-nodlopen)) filtmod1 filtmod2 \
|
||||
nodelmod1 nodelmod2 nodelmod3 nodelmod4 \
|
||||
nodel2mod1 nodel2mod2 nodel2mod3 \
|
||||
nodlopenmod nodlopenmod2 filtmod1 filtmod2 \
|
||||
reldepmod1 reldepmod2 reldepmod3 reldepmod4 nextmod1 nextmod2 \
|
||||
reldep4mod1 reldep4mod2 reldep4mod3 reldep4mod4 \
|
||||
neededobj1 neededobj2 neededobj3 neededobj4 \
|
||||
|
|
@ -221,9 +220,6 @@ ifeq (yesyes,$(have-fpie)$(build-shared))
|
|||
modules-names += tst-piemod1
|
||||
endif
|
||||
modules-vis-yes = vismod1 vismod2 vismod3
|
||||
modules-nodelete-yes = nodelmod1 nodelmod2 nodelmod3 nodelmod4 \
|
||||
nodel2mod1 nodel2mod2 nodel2mod3
|
||||
modules-nodlopen-yes = nodlopenmod nodlopenmod2
|
||||
modules-execstack-yes = tst-execstack-mod
|
||||
extra-test-objs += $(addsuffix .os,$(strip $(modules-names)))
|
||||
# We need this variable to be sure the test modules get the right CPPFLAGS.
|
||||
|
|
@ -916,3 +912,5 @@ $(objpfx)tst-leaks1-mem: $(objpfx)tst-leaks1.out
|
|||
tst-leaks1-ENV = MALLOC_TRACE=$(objpfx)tst-leaks1.mtrace
|
||||
|
||||
$(objpfx)tst-addr1: $(libdl)
|
||||
|
||||
$(objpfx)tst-thrlock: $(libdl) $(shared-thread-library)
|
||||
|
|
|
|||
|
|
@ -93,9 +93,7 @@ _dl_addr (const void *address, Dl_info *info,
|
|||
so we can omit that test here. */
|
||||
if ((symtab[symndx].st_shndx != SHN_UNDEF
|
||||
|| symtab[symndx].st_value != 0)
|
||||
#ifdef USE_TLS
|
||||
&& ELFW(ST_TYPE) (symtab[symndx].st_info) != STT_TLS
|
||||
#endif
|
||||
&& DL_ADDR_SYM_MATCH (match, &symtab[symndx],
|
||||
matchsym, addr)
|
||||
&& symtab[symndx].st_name < strtabsize)
|
||||
|
|
@ -123,9 +121,7 @@ _dl_addr (const void *address, Dl_info *info,
|
|||
for (; (void *) symtab < (void *) symtabend; ++symtab)
|
||||
if ((ELFW(ST_BIND) (symtab->st_info) == STB_GLOBAL
|
||||
|| ELFW(ST_BIND) (symtab->st_info) == STB_WEAK)
|
||||
#ifdef USE_TLS
|
||||
&& ELFW(ST_TYPE) (symtab->st_info) != STT_TLS
|
||||
#endif
|
||||
&& (symtab->st_shndx != SHN_UNDEF
|
||||
|| symtab->st_value != 0)
|
||||
&& DL_ADDR_SYM_MATCH (match, symtab, matchsym, addr)
|
||||
|
|
|
|||
|
|
@ -256,11 +256,7 @@ _dl_load_cache_lookup (const char *name)
|
|||
platform = 1ULL << platform;
|
||||
|
||||
/* Only accept hwcap if it's for the right platform. */
|
||||
#ifdef USE_TLS
|
||||
# define _DL_HWCAP_TLS_MASK (1LL << 63)
|
||||
#else
|
||||
# define _DL_HWCAP_TLS_MASK 0
|
||||
#endif
|
||||
#define _DL_HWCAP_TLS_MASK (1LL << 63)
|
||||
#define HWCAP_CHECK \
|
||||
if (GLRO(dl_osversion) && lib->osversion > GLRO(dl_osversion)) \
|
||||
continue; \
|
||||
|
|
|
|||
|
|
@ -41,7 +41,6 @@ typedef void (*fini_t) (void);
|
|||
#define IDX_STILL_USED -1
|
||||
|
||||
|
||||
#ifdef USE_TLS
|
||||
/* Returns true we an non-empty was found. */
|
||||
static bool
|
||||
remove_slotinfo (size_t idx, struct dtv_slotinfo_list *listp, size_t disp,
|
||||
|
|
@ -103,26 +102,12 @@ remove_slotinfo (size_t idx, struct dtv_slotinfo_list *listp, size_t disp,
|
|||
/* No non-entry in this list element. */
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
void
|
||||
_dl_close (void *_map)
|
||||
_dl_close_worker (struct link_map *map)
|
||||
{
|
||||
struct link_map *map = _map;
|
||||
Lmid_t ns = map->l_ns;
|
||||
unsigned int i;
|
||||
/* First see whether we can remove the object at all. */
|
||||
if (__builtin_expect (map->l_flags_1 & DF_1_NODELETE, 0)
|
||||
&& map->l_init_called)
|
||||
/* Nope. Do nothing. */
|
||||
return;
|
||||
|
||||
if (__builtin_expect (map->l_direct_opencount, 1) == 0)
|
||||
GLRO(dl_signal_error) (0, map->l_name, NULL, N_("shared object not open"));
|
||||
|
||||
/* Acquire the lock. */
|
||||
__rtld_lock_lock_recursive (GL(dl_load_lock));
|
||||
|
||||
/* One less direct use. */
|
||||
--map->l_direct_opencount;
|
||||
|
|
@ -143,16 +128,13 @@ _dl_close (void *_map)
|
|||
_dl_debug_printf ("\nclosing file=%s; direct_opencount=%u\n",
|
||||
map->l_name, map->l_direct_opencount);
|
||||
|
||||
__rtld_lock_unlock_recursive (GL(dl_load_lock));
|
||||
return;
|
||||
}
|
||||
|
||||
retry:
|
||||
dl_close_state = pending;
|
||||
|
||||
#ifdef USE_TLS
|
||||
bool any_tls = false;
|
||||
#endif
|
||||
const unsigned int nloaded = GL(dl_ns)[ns]._ns_nloaded;
|
||||
char used[nloaded];
|
||||
char done[nloaded];
|
||||
|
|
@ -246,7 +228,7 @@ _dl_close (void *_map)
|
|||
#endif
|
||||
bool unload_any = false;
|
||||
unsigned int first_loaded = ~0;
|
||||
for (i = 0; i < nloaded; ++i)
|
||||
for (unsigned int i = 0; i < nloaded; ++i)
|
||||
{
|
||||
struct link_map *imap = maps[i];
|
||||
|
||||
|
|
@ -417,7 +399,7 @@ _dl_close (void *_map)
|
|||
|
||||
struct r_scope_elem **old = imap->l_scope;
|
||||
|
||||
if (SINGLE_THREAD_P)
|
||||
if (RTLD_SINGLE_THREAD_P)
|
||||
imap->l_scope = newp;
|
||||
else
|
||||
{
|
||||
|
|
@ -474,15 +456,13 @@ _dl_close (void *_map)
|
|||
r->r_state = RT_DELETE;
|
||||
_dl_debug_state ();
|
||||
|
||||
#ifdef USE_TLS
|
||||
size_t tls_free_start;
|
||||
size_t tls_free_end;
|
||||
tls_free_start = tls_free_end = NO_TLS_OFFSET;
|
||||
#endif
|
||||
|
||||
/* Check each element of the search list to see if all references to
|
||||
it are gone. */
|
||||
for (i = first_loaded; i < nloaded; ++i)
|
||||
for (unsigned int i = first_loaded; i < nloaded; ++i)
|
||||
{
|
||||
struct link_map *imap = maps[i];
|
||||
if (!used[i])
|
||||
|
|
@ -509,7 +489,6 @@ _dl_close (void *_map)
|
|||
--GL(dl_ns)[ns]._ns_main_searchlist->r_nlist;
|
||||
}
|
||||
|
||||
#ifdef USE_TLS
|
||||
/* Remove the object from the dtv slotinfo array if it uses TLS. */
|
||||
if (__builtin_expect (imap->l_tls_blocksize > 0, 0))
|
||||
{
|
||||
|
|
@ -528,7 +507,7 @@ _dl_close (void *_map)
|
|||
this search list, going in either direction. When the
|
||||
whole chunk is at the end of the used area then we can
|
||||
reclaim it. */
|
||||
# if TLS_TCB_AT_TP
|
||||
#if TLS_TCB_AT_TP
|
||||
if (tls_free_start == NO_TLS_OFFSET
|
||||
|| (size_t) imap->l_tls_offset == tls_free_start)
|
||||
{
|
||||
|
|
@ -568,7 +547,7 @@ _dl_close (void *_map)
|
|||
= tls_free_end - imap->l_tls_blocksize;
|
||||
}
|
||||
}
|
||||
# elif TLS_DTV_AT_TP
|
||||
#elif TLS_DTV_AT_TP
|
||||
if ((size_t) imap->l_tls_offset == tls_free_end)
|
||||
/* Extend the contiguous chunk being reclaimed. */
|
||||
tls_free_end -= imap->l_tls_blocksize;
|
||||
|
|
@ -585,12 +564,11 @@ _dl_close (void *_map)
|
|||
tls_free_start = imap->l_tls_offset;
|
||||
tls_free_end = tls_free_start + imap->l_tls_blocksize;
|
||||
}
|
||||
# else
|
||||
# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
|
||||
# endif
|
||||
#else
|
||||
# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* We can unmap all the maps at once. We determined the
|
||||
start address and length when we loaded the object and
|
||||
|
|
@ -656,7 +634,6 @@ _dl_close (void *_map)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef USE_TLS
|
||||
/* If we removed any object which uses TLS bump the generation counter. */
|
||||
if (any_tls)
|
||||
{
|
||||
|
|
@ -666,7 +643,6 @@ _dl_close (void *_map)
|
|||
if (tls_free_end == GL(dl_tls_static_used))
|
||||
GL(dl_tls_static_used) = tls_free_start;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef SHARED
|
||||
/* Auditing checkpoint: we have deleted all objects. */
|
||||
|
|
@ -698,11 +674,34 @@ _dl_close (void *_map)
|
|||
goto retry;
|
||||
|
||||
dl_close_state = not_pending;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
_dl_close (void *_map)
|
||||
{
|
||||
struct link_map *map = _map;
|
||||
|
||||
/* First see whether we can remove the object at all. */
|
||||
if (__builtin_expect (map->l_flags_1 & DF_1_NODELETE, 0))
|
||||
{
|
||||
assert (map->l_init_called);
|
||||
/* Nope. Do nothing. */
|
||||
return;
|
||||
}
|
||||
|
||||
if (__builtin_expect (map->l_direct_opencount, 1) == 0)
|
||||
GLRO(dl_signal_error) (0, map->l_name, NULL, N_("shared object not open"));
|
||||
|
||||
/* Acquire the lock. */
|
||||
__rtld_lock_lock_recursive (GL(dl_load_lock));
|
||||
|
||||
_dl_close_worker (map);
|
||||
|
||||
__rtld_lock_unlock_recursive (GL(dl_load_lock));
|
||||
}
|
||||
|
||||
|
||||
#ifdef USE_TLS
|
||||
static bool __libc_freeres_fn_section
|
||||
free_slotinfo (struct dtv_slotinfo_list **elemp)
|
||||
{
|
||||
|
|
@ -729,7 +728,6 @@ free_slotinfo (struct dtv_slotinfo_list **elemp)
|
|||
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
libc_freeres_fn (free_mem)
|
||||
|
|
@ -755,22 +753,20 @@ libc_freeres_fn (free_mem)
|
|||
free (old);
|
||||
}
|
||||
|
||||
#ifdef USE_TLS
|
||||
if (USE___THREAD || GL(dl_tls_dtv_slotinfo_list) != NULL)
|
||||
{
|
||||
/* Free the memory allocated for the dtv slotinfo array. We can do
|
||||
this only if all modules which used this memory are unloaded. */
|
||||
# ifdef SHARED
|
||||
#ifdef SHARED
|
||||
if (GL(dl_initial_dtv) == NULL)
|
||||
/* There was no initial TLS setup, it was set up later when
|
||||
it used the normal malloc. */
|
||||
free_slotinfo (&GL(dl_tls_dtv_slotinfo_list));
|
||||
else
|
||||
# endif
|
||||
#endif
|
||||
/* The first element of the list does not have to be deallocated.
|
||||
It was allocated in the dynamic linker (i.e., with a different
|
||||
malloc), and in the static library it's in .bss space. */
|
||||
free_slotinfo (&GL(dl_tls_dtv_slotinfo_list)->next);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
|
|
|||
|
|
@ -70,11 +70,9 @@ __dl_iterate_phdr (int (*callback) (struct dl_phdr_info *info,
|
|||
info.dlpi_subs = GL(dl_load_adds) - nloaded;
|
||||
info.dlpi_tls_modid = 0;
|
||||
info.dlpi_tls_data = NULL;
|
||||
#ifdef USE_TLS
|
||||
info.dlpi_tls_modid = l->l_tls_modid;
|
||||
if (info.dlpi_tls_modid != 0)
|
||||
info.dlpi_tls_data = _dl_tls_get_addr_soft (l);
|
||||
#endif
|
||||
ret = callback (&info, sizeof (struct dl_phdr_info), data);
|
||||
if (ret)
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -1085,7 +1085,6 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp,
|
|||
break;
|
||||
|
||||
case PT_TLS:
|
||||
#ifdef USE_TLS
|
||||
if (ph->p_memsz == 0)
|
||||
/* Nothing to do for an empty segment. */
|
||||
break;
|
||||
|
|
@ -1113,7 +1112,7 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp,
|
|||
break;
|
||||
}
|
||||
|
||||
# ifdef SHARED
|
||||
#ifdef SHARED
|
||||
if (l->l_prev == NULL || (mode & __RTLD_AUDIT) != 0)
|
||||
/* We are loading the executable itself when the dynamic linker
|
||||
was executed directly. The setup will happen later. */
|
||||
|
|
@ -1122,7 +1121,7 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp,
|
|||
/* In a static binary there is no way to tell if we dynamically
|
||||
loaded libpthread. */
|
||||
if (GL(dl_error_catch_tsd) == &_dl_initial_error_catch_tsd)
|
||||
# endif
|
||||
#endif
|
||||
{
|
||||
/* We have not yet loaded libpthread.
|
||||
We can do the TLS setup right now! */
|
||||
|
|
@ -1155,7 +1154,6 @@ cannot allocate TLS data structures for initial thread");
|
|||
_dl_deallocate_tls (tcb, 1);
|
||||
goto call_lose;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Uh-oh, the binary expects TLS support but we cannot
|
||||
provide it. */
|
||||
|
|
@ -1394,7 +1392,7 @@ cannot allocate TLS data structures for initial thread");
|
|||
requires that it be executable. We must change the
|
||||
protection of the variable which contains the flags used in
|
||||
the mprotect calls. */
|
||||
#if defined HAVE_Z_RELRO && defined SHARED
|
||||
#ifdef SHARED
|
||||
if ((mode & (__RTLD_DLOPEN | __RTLD_AUDIT)) == __RTLD_DLOPEN)
|
||||
{
|
||||
const uintptr_t p = (uintptr_t) &__stack_prot & -GLRO(dl_pagesize);
|
||||
|
|
@ -1431,11 +1429,9 @@ cannot enable executable stack as shared object requires");
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef USE_TLS
|
||||
/* Adjust the address of the TLS initialization image. */
|
||||
if (l->l_tls_initimage != NULL)
|
||||
l->l_tls_initimage = (char *) l->l_tls_initimage + l->l_addr;
|
||||
#endif
|
||||
|
||||
/* We are done mapping in the file. We no longer need the descriptor. */
|
||||
if (__builtin_expect (__close (fd) != 0, 0))
|
||||
|
|
@ -1939,11 +1935,10 @@ open_path (const char *name, size_t namelen, int preloaded,
|
|||
must not be freed using the general free() in libc. */
|
||||
if (sps->malloced)
|
||||
free (sps->dirs);
|
||||
#ifdef HAVE_Z_RELRO
|
||||
|
||||
/* rtld_search_dirs is attribute_relro, therefore avoid writing
|
||||
into it. */
|
||||
if (sps != &rtld_search_dirs)
|
||||
#endif
|
||||
sps->dirs = (void *) -1;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -449,12 +449,10 @@ _dl_debug_bindings (const char *undef_name, struct link_map *undef_map,
|
|||
conflict = 1;
|
||||
}
|
||||
|
||||
# ifdef USE_TLS
|
||||
if (value->s
|
||||
&& (__builtin_expect (ELFW(ST_TYPE) (value->s->st_info)
|
||||
== STT_TLS, 0)))
|
||||
type_class = 4;
|
||||
# endif
|
||||
|
||||
if (conflict
|
||||
|| GLRO(dl_trace_prelink_map) == undef_map
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@ _dl_new_object (char *realname, const char *libname, int type,
|
|||
new->l_name = realname;
|
||||
new->l_type = type;
|
||||
new->l_loader = loader;
|
||||
#if defined USE_TLS && NO_TLS_OFFSET != 0
|
||||
#if NO_TLS_OFFSET != 0
|
||||
new->l_tls_offset = NO_TLS_OFFSET;
|
||||
#endif
|
||||
new->l_ns = nsid;
|
||||
|
|
|
|||
|
|
@ -164,9 +164,7 @@ dl_open_worker (void *a)
|
|||
struct link_map *new, *l;
|
||||
int lazy;
|
||||
unsigned int i;
|
||||
#ifdef USE_TLS
|
||||
bool any_tls = false;
|
||||
#endif
|
||||
struct link_map *call_map = NULL;
|
||||
|
||||
/* Check whether _dl_open() has been called from a valid DSO. */
|
||||
|
|
@ -419,7 +417,7 @@ dl_open_worker (void *a)
|
|||
memcpy (newp, imap->l_scope, cnt * sizeof (imap->l_scope[0]));
|
||||
struct r_scope_elem **old = imap->l_scope;
|
||||
|
||||
if (SINGLE_THREAD_P)
|
||||
if (RTLD_SINGLE_THREAD_P)
|
||||
imap->l_scope = newp;
|
||||
else
|
||||
{
|
||||
|
|
@ -441,7 +439,6 @@ dl_open_worker (void *a)
|
|||
atomic_write_barrier ();
|
||||
imap->l_scope[cnt] = &new->l_searchlist;
|
||||
}
|
||||
#if USE_TLS
|
||||
/* Only add TLS memory if this object is loaded now and
|
||||
therefore is not yet initialized. */
|
||||
else if (! imap->l_init_called
|
||||
|
|
@ -456,11 +453,11 @@ dl_open_worker (void *a)
|
|||
if (imap->l_need_tls_init)
|
||||
{
|
||||
imap->l_need_tls_init = 0;
|
||||
# ifdef SHARED
|
||||
#ifdef SHARED
|
||||
/* Update the slot information data for at least the
|
||||
generation of the DSO we are allocating data for. */
|
||||
_dl_update_slotinfo (imap->l_tls_modid);
|
||||
# endif
|
||||
#endif
|
||||
|
||||
GL(dl_init_static_tls) (imap);
|
||||
assert (imap->l_need_tls_init == 0);
|
||||
|
|
@ -469,15 +466,12 @@ dl_open_worker (void *a)
|
|||
/* We have to bump the generation counter. */
|
||||
any_tls = true;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#if USE_TLS
|
||||
/* Bump the generation number if necessary. */
|
||||
if (any_tls && __builtin_expect (++GL(dl_tls_generation) == 0, 0))
|
||||
_dl_fatal_printf (N_("\
|
||||
TLS generation counter wrapped! Please report this."));
|
||||
#endif
|
||||
|
||||
/* Run the initializer functions of new objects. */
|
||||
_dl_init (new, args->argc, args->argv, args->env);
|
||||
|
|
@ -574,7 +568,6 @@ no more namespaces available for dlmopen()"));
|
|||
state if relocation failed, for example. */
|
||||
if (args.map)
|
||||
{
|
||||
#ifdef USE_TLS
|
||||
/* Maybe some of the modules which were loaded use TLS.
|
||||
Since it will be removed in the following _dl_close call
|
||||
we have to mark the dtv array as having gaps to fill the
|
||||
|
|
@ -584,9 +577,8 @@ no more namespaces available for dlmopen()"));
|
|||
up. */
|
||||
if ((mode & __RTLD_AUDIT) == 0)
|
||||
GL(dl_tls_dtv_gaps) = true;
|
||||
#endif
|
||||
|
||||
_dl_close (args.map);
|
||||
_dl_close_worker (args.map);
|
||||
}
|
||||
|
||||
assert (_dl_debug_initialize (0, args.nsid)->r_state == RT_CONSISTENT);
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/* Relocate a shared object and resolve its references to other loaded objects.
|
||||
Copyright (C) 1995-2004, 2005 Free Software Foundation, Inc.
|
||||
Copyright (C) 1995-2004, 2005, 2006 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
|
||||
|
|
@ -35,7 +35,6 @@
|
|||
#endif
|
||||
|
||||
|
||||
#ifdef USE_TLS
|
||||
/* We are trying to perform a static TLS relocation in MAP, but it was
|
||||
dynamically loaded. This can only work if there is enough surplus in
|
||||
the static TLS area already allocated for each running thread. If this
|
||||
|
|
@ -56,7 +55,7 @@ _dl_allocate_static_tls (struct link_map *map)
|
|||
cannot allocate memory in static TLS block"));
|
||||
}
|
||||
|
||||
# if TLS_TCB_AT_TP
|
||||
#if TLS_TCB_AT_TP
|
||||
size_t freebytes;
|
||||
size_t n;
|
||||
size_t blsize;
|
||||
|
|
@ -73,7 +72,7 @@ cannot allocate memory in static TLS block"));
|
|||
- map->l_tls_firstbyte_offset);
|
||||
|
||||
map->l_tls_offset = GL(dl_tls_static_used) = offset;
|
||||
# elif TLS_DTV_AT_TP
|
||||
#elif TLS_DTV_AT_TP
|
||||
size_t used;
|
||||
size_t check;
|
||||
|
||||
|
|
@ -87,9 +86,9 @@ cannot allocate memory in static TLS block"));
|
|||
|
||||
map->l_tls_offset = offset;
|
||||
GL(dl_tls_static_used) = used;
|
||||
# else
|
||||
# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
|
||||
# endif
|
||||
#else
|
||||
# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
|
||||
#endif
|
||||
|
||||
/* If the object is not yet relocated we cannot initialize the
|
||||
static TLS region. Delay it. */
|
||||
|
|
@ -115,13 +114,13 @@ cannot allocate memory in static TLS block"));
|
|||
void
|
||||
_dl_nothread_init_static_tls (struct link_map *map)
|
||||
{
|
||||
# if TLS_TCB_AT_TP
|
||||
#if TLS_TCB_AT_TP
|
||||
void *dest = (char *) THREAD_SELF - map->l_tls_offset;
|
||||
# elif TLS_DTV_AT_TP
|
||||
#elif TLS_DTV_AT_TP
|
||||
void *dest = (char *) THREAD_SELF + map->l_tls_offset + TLS_PRE_TCB_SIZE;
|
||||
# else
|
||||
# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
|
||||
# endif
|
||||
#else
|
||||
# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
|
||||
#endif
|
||||
|
||||
/* Fill in the DTV slot so that a later LD/GD access will find it. */
|
||||
dtv_t *dtv = THREAD_DTV ();
|
||||
|
|
@ -133,7 +132,6 @@ _dl_nothread_init_static_tls (struct link_map *map)
|
|||
memset (__mempcpy (dest, map->l_tls_initimage, map->l_tls_initimage_size),
|
||||
'\0', map->l_tls_blocksize - map->l_tls_initimage_size);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
void
|
||||
|
|
|
|||
|
|
@ -93,14 +93,14 @@ _dl_fixup (
|
|||
version = NULL;
|
||||
}
|
||||
|
||||
if (l->l_type == lt_loaded && !SINGLE_THREAD_P)
|
||||
if (l->l_type == lt_loaded && !RTLD_SINGLE_THREAD_P)
|
||||
__rtld_mrlock_lock (l->l_scope_lock);
|
||||
|
||||
result = _dl_lookup_symbol_x (strtab + sym->st_name, l, &sym,
|
||||
l->l_scope, version, ELF_RTYPE_CLASS_PLT,
|
||||
DL_LOOKUP_ADD_DEPENDENCY, NULL);
|
||||
|
||||
if (l->l_type == lt_loaded && !SINGLE_THREAD_P)
|
||||
if (l->l_type == lt_loaded && !RTLD_SINGLE_THREAD_P)
|
||||
__rtld_mrlock_unlock (l->l_scope_lock);
|
||||
|
||||
/* Currently result contains the base load address (or link map)
|
||||
|
|
@ -181,7 +181,7 @@ _dl_profile_fixup (
|
|||
version = NULL;
|
||||
}
|
||||
|
||||
if (l->l_type == lt_loaded && !SINGLE_THREAD_P)
|
||||
if (l->l_type == lt_loaded && !RTLD_SINGLE_THREAD_P)
|
||||
__rtld_mrlock_lock (l->l_scope_lock);
|
||||
|
||||
result = _dl_lookup_symbol_x (strtab + refsym->st_name, l, &defsym,
|
||||
|
|
@ -189,7 +189,7 @@ _dl_profile_fixup (
|
|||
ELF_RTYPE_CLASS_PLT,
|
||||
DL_LOOKUP_ADD_DEPENDENCY, NULL);
|
||||
|
||||
if (l->l_type == lt_loaded && !SINGLE_THREAD_P)
|
||||
if (l->l_type == lt_loaded && !RTLD_SINGLE_THREAD_P)
|
||||
__rtld_mrlock_unlock (l->l_scope_lock);
|
||||
|
||||
/* Currently result contains the base load address (or link map)
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/* Support for dynamic linking code in static libc.
|
||||
Copyright (C) 1996-2002, 2003, 2004, 2005 Free Software Foundation, Inc.
|
||||
Copyright (C) 1996-2005, 2006 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
|
||||
|
|
@ -97,9 +97,7 @@ int _dl_starting_up = 1;
|
|||
hp_timing_t _dl_cpuclock_offset;
|
||||
#endif
|
||||
|
||||
#ifdef USE_TLS
|
||||
void (*_dl_init_static_tls) (struct link_map *) = &_dl_nothread_init_static_tls;
|
||||
#endif
|
||||
|
||||
size_t _dl_pagesize;
|
||||
|
||||
|
|
|
|||
10
elf/dl-sym.c
10
elf/dl-sym.c
|
|
@ -26,12 +26,10 @@
|
|||
#include <ldsodefs.h>
|
||||
#include <dl-hash.h>
|
||||
#include <sysdep-cancel.h>
|
||||
#ifdef USE_TLS
|
||||
# include <dl-tls.h>
|
||||
#endif
|
||||
#include <dl-tls.h>
|
||||
|
||||
|
||||
#if defined USE_TLS && defined SHARED
|
||||
#ifdef SHARED
|
||||
/* Systems which do not have tls_index also probably have to define
|
||||
DONT_USE_TLS_INDEX. */
|
||||
|
||||
|
|
@ -115,7 +113,7 @@ do_sym (void *handle, const char *name, void *who,
|
|||
the initial binary. And then the more complex part
|
||||
where the object is dynamically loaded and the scope
|
||||
array can change. */
|
||||
if (match->l_type != lt_loaded || SINGLE_THREAD_P)
|
||||
if (match->l_type != lt_loaded || RTLD_SINGLE_THREAD_P)
|
||||
result = GLRO(dl_lookup_symbol_x) (name, match, &ref,
|
||||
match->l_scope, vers, 0,
|
||||
flags | DL_LOOKUP_ADD_DEPENDENCY,
|
||||
|
|
@ -184,7 +182,7 @@ RTLD_NEXT used in code not dynamically loaded"));
|
|||
{
|
||||
void *value;
|
||||
|
||||
#if defined USE_TLS && defined SHARED
|
||||
#ifdef SHARED
|
||||
if (ELFW(ST_TYPE) (ref->st_info) == STT_TLS)
|
||||
/* The found symbol is a thread-local storage variable.
|
||||
Return the address for to the current thread. */
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/* Operating system support for run-time dynamic linker. Generic Unix version.
|
||||
Copyright (C) 1995-1998, 2000-2003, 2004, 2005 Free Software Foundation, Inc.
|
||||
Copyright (C) 1995-1998, 2000-2005, 2006 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
|
||||
|
|
@ -405,25 +405,8 @@ _dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz,
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifdef USE_TLS
|
||||
/* For TLS enabled builds always add 'tls'. */
|
||||
++cnt;
|
||||
#else
|
||||
if (cnt == 0)
|
||||
{
|
||||
/* If we no have platform name and no important capability we only
|
||||
have the base directory to search. */
|
||||
result = (struct r_strlenpair *) malloc (sizeof (*result));
|
||||
if (result == NULL)
|
||||
goto no_memory;
|
||||
|
||||
result[0].str = (char *) result; /* Does not really matter. */
|
||||
result[0].len = 0;
|
||||
|
||||
*sz = 1;
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Create temporary data structure to generate result table. */
|
||||
temp = (struct r_strlenpair *) alloca (cnt * sizeof (*temp));
|
||||
|
|
@ -465,11 +448,11 @@ _dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz,
|
|||
temp[m].len = platform_len;
|
||||
++m;
|
||||
}
|
||||
#ifdef USE_TLS
|
||||
|
||||
temp[m].str = "tls";
|
||||
temp[m].len = 3;
|
||||
++m;
|
||||
#endif
|
||||
|
||||
assert (m == cnt);
|
||||
|
||||
/* Determine the total size of all strings together. */
|
||||
|
|
@ -487,13 +470,8 @@ _dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz,
|
|||
*sz = 1 << cnt;
|
||||
result = (struct r_strlenpair *) malloc (*sz * sizeof (*result) + total);
|
||||
if (result == NULL)
|
||||
{
|
||||
#ifndef USE_TLS
|
||||
no_memory:
|
||||
#endif
|
||||
_dl_signal_error (ENOMEM, NULL, NULL,
|
||||
N_("cannot create capability list"));
|
||||
}
|
||||
_dl_signal_error (ENOMEM, NULL, NULL,
|
||||
N_("cannot create capability list"));
|
||||
|
||||
if (cnt == 1)
|
||||
{
|
||||
|
|
|
|||
79
elf/dl-tls.c
79
elf/dl-tls.c
|
|
@ -26,30 +26,26 @@
|
|||
#include <sys/param.h>
|
||||
|
||||
#include <tls.h>
|
||||
|
||||
/* We don't need any of this if TLS is not supported. */
|
||||
#ifdef USE_TLS
|
||||
|
||||
# include <dl-tls.h>
|
||||
# include <ldsodefs.h>
|
||||
#include <dl-tls.h>
|
||||
#include <ldsodefs.h>
|
||||
|
||||
/* Amount of excess space to allocate in the static TLS area
|
||||
to allow dynamic loading of modules defining IE-model TLS data. */
|
||||
# define TLS_STATIC_SURPLUS 64 + DL_NNS * 100
|
||||
#define TLS_STATIC_SURPLUS 64 + DL_NNS * 100
|
||||
|
||||
/* Value used for dtv entries for which the allocation is delayed. */
|
||||
# define TLS_DTV_UNALLOCATED ((void *) -1l)
|
||||
#define TLS_DTV_UNALLOCATED ((void *) -1l)
|
||||
|
||||
|
||||
/* Out-of-memory handler. */
|
||||
# ifdef SHARED
|
||||
#ifdef SHARED
|
||||
static void
|
||||
__attribute__ ((__noreturn__))
|
||||
oom (void)
|
||||
{
|
||||
_dl_fatal_printf ("cannot allocate memory for thread-local data: ABORT\n");
|
||||
}
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
size_t
|
||||
|
|
@ -113,7 +109,7 @@ _dl_next_tls_modid (void)
|
|||
}
|
||||
|
||||
|
||||
# ifdef SHARED
|
||||
#ifdef SHARED
|
||||
void
|
||||
internal_function
|
||||
_dl_determine_tlsoffset (void)
|
||||
|
|
@ -158,7 +154,7 @@ _dl_determine_tlsoffset (void)
|
|||
memory requirement for the next TLS block is smaller than the
|
||||
gap. */
|
||||
|
||||
# if TLS_TCB_AT_TP
|
||||
#if TLS_TCB_AT_TP
|
||||
/* We simply start with zero. */
|
||||
size_t offset = 0;
|
||||
|
||||
|
|
@ -205,7 +201,7 @@ _dl_determine_tlsoffset (void)
|
|||
GL(dl_tls_static_used) = offset;
|
||||
GL(dl_tls_static_size) = (roundup (offset + TLS_STATIC_SURPLUS, max_align)
|
||||
+ TLS_TCB_SIZE);
|
||||
# elif TLS_DTV_AT_TP
|
||||
#elif TLS_DTV_AT_TP
|
||||
/* The TLS blocks start right after the TCB. */
|
||||
size_t offset = TLS_TCB_SIZE;
|
||||
|
||||
|
|
@ -249,9 +245,9 @@ _dl_determine_tlsoffset (void)
|
|||
GL(dl_tls_static_used) = offset;
|
||||
GL(dl_tls_static_size) = roundup (offset + TLS_STATIC_SURPLUS,
|
||||
TLS_TCB_ALIGN);
|
||||
# else
|
||||
# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
|
||||
# endif
|
||||
#else
|
||||
# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
|
||||
#endif
|
||||
|
||||
/* The alignment requirement for the static TLS block. */
|
||||
GL(dl_tls_static_align) = max_align;
|
||||
|
|
@ -288,7 +284,7 @@ _dl_tls_setup (void)
|
|||
return 0;
|
||||
}
|
||||
rtld_hidden_def (_dl_tls_setup)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
static void *
|
||||
internal_function
|
||||
|
|
@ -337,13 +333,13 @@ _dl_allocate_tls_storage (void)
|
|||
void *result;
|
||||
size_t size = GL(dl_tls_static_size);
|
||||
|
||||
# if TLS_DTV_AT_TP
|
||||
#if TLS_DTV_AT_TP
|
||||
/* Memory layout is:
|
||||
[ TLS_PRE_TCB_SIZE ] [ TLS_TCB_SIZE ] [ TLS blocks ]
|
||||
^ This should be returned. */
|
||||
size += (TLS_PRE_TCB_SIZE + GL(dl_tls_static_align) - 1)
|
||||
& ~(GL(dl_tls_static_align) - 1);
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Allocate a correctly aligned chunk of memory. */
|
||||
result = __libc_memalign (GL(dl_tls_static_align), size);
|
||||
|
|
@ -352,14 +348,14 @@ _dl_allocate_tls_storage (void)
|
|||
/* Allocate the DTV. */
|
||||
void *allocated = result;
|
||||
|
||||
# if TLS_TCB_AT_TP
|
||||
#if TLS_TCB_AT_TP
|
||||
/* The TCB follows the TLS blocks. */
|
||||
result = (char *) result + size - TLS_TCB_SIZE;
|
||||
|
||||
/* Clear the TCB data structure. We can't ask the caller (i.e.
|
||||
libpthread) to do it, because we will initialize the DTV et al. */
|
||||
memset (result, '\0', TLS_TCB_SIZE);
|
||||
# elif TLS_DTV_AT_TP
|
||||
#elif TLS_DTV_AT_TP
|
||||
result = (char *) result + size - GL(dl_tls_static_size);
|
||||
|
||||
/* Clear the TCB data structure and TLS_PRE_TCB_SIZE bytes before it.
|
||||
|
|
@ -367,7 +363,7 @@ _dl_allocate_tls_storage (void)
|
|||
initialize the DTV et al. */
|
||||
memset ((char *) result - TLS_PRE_TCB_SIZE, '\0',
|
||||
TLS_PRE_TCB_SIZE + TLS_TCB_SIZE);
|
||||
# endif
|
||||
#endif
|
||||
|
||||
result = allocate_dtv (result);
|
||||
if (result == NULL)
|
||||
|
|
@ -428,14 +424,14 @@ _dl_allocate_tls_init (void *result)
|
|||
|
||||
assert (map->l_tls_modid == cnt);
|
||||
assert (map->l_tls_blocksize >= map->l_tls_initimage_size);
|
||||
# if TLS_TCB_AT_TP
|
||||
#if TLS_TCB_AT_TP
|
||||
assert ((size_t) map->l_tls_offset >= map->l_tls_blocksize);
|
||||
dest = (char *) result - map->l_tls_offset;
|
||||
# elif TLS_DTV_AT_TP
|
||||
#elif TLS_DTV_AT_TP
|
||||
dest = (char *) result + map->l_tls_offset;
|
||||
# else
|
||||
# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
|
||||
# endif
|
||||
#else
|
||||
# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
|
||||
#endif
|
||||
|
||||
/* Copy the initialization image and clear the BSS part. */
|
||||
dtv[map->l_tls_modid].pointer.val = dest;
|
||||
|
|
@ -491,21 +487,21 @@ _dl_deallocate_tls (void *tcb, bool dealloc_tcb)
|
|||
|
||||
if (dealloc_tcb)
|
||||
{
|
||||
# if TLS_TCB_AT_TP
|
||||
#if TLS_TCB_AT_TP
|
||||
/* The TCB follows the TLS blocks. Back up to free the whole block. */
|
||||
tcb -= GL(dl_tls_static_size) - TLS_TCB_SIZE;
|
||||
# elif TLS_DTV_AT_TP
|
||||
#elif TLS_DTV_AT_TP
|
||||
/* Back up the TLS_PRE_TCB_SIZE bytes. */
|
||||
tcb -= (TLS_PRE_TCB_SIZE + GL(dl_tls_static_align) - 1)
|
||||
& ~(GL(dl_tls_static_align) - 1);
|
||||
# endif
|
||||
#endif
|
||||
free (tcb);
|
||||
}
|
||||
}
|
||||
rtld_hidden_def (_dl_deallocate_tls)
|
||||
|
||||
|
||||
# ifdef SHARED
|
||||
#ifdef SHARED
|
||||
/* The __tls_get_addr function has two basic forms which differ in the
|
||||
arguments. The IA-64 form takes two parameters, the module ID and
|
||||
offset. The form used, among others, on IA-32 takes a reference to
|
||||
|
|
@ -513,15 +509,15 @@ rtld_hidden_def (_dl_deallocate_tls)
|
|||
form seems to be more often used (in the moment) so we default to
|
||||
it. Users of the IA-64 form have to provide adequate definitions
|
||||
of the following macros. */
|
||||
# ifndef GET_ADDR_ARGS
|
||||
# define GET_ADDR_ARGS tls_index *ti
|
||||
# endif
|
||||
# ifndef GET_ADDR_MODULE
|
||||
# define GET_ADDR_MODULE ti->ti_module
|
||||
# endif
|
||||
# ifndef GET_ADDR_OFFSET
|
||||
# define GET_ADDR_OFFSET ti->ti_offset
|
||||
# endif
|
||||
# ifndef GET_ADDR_ARGS
|
||||
# define GET_ADDR_ARGS tls_index *ti
|
||||
# endif
|
||||
# ifndef GET_ADDR_MODULE
|
||||
# define GET_ADDR_MODULE ti->ti_module
|
||||
# endif
|
||||
# ifndef GET_ADDR_OFFSET
|
||||
# define GET_ADDR_OFFSET ti->ti_offset
|
||||
# endif
|
||||
|
||||
|
||||
static void *
|
||||
|
|
@ -732,7 +728,7 @@ __tls_get_addr (GET_ADDR_ARGS)
|
|||
|
||||
return (char *) p + GET_ADDR_OFFSET;
|
||||
}
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
/* Look up the module's TLS block as for __tls_get_addr,
|
||||
|
|
@ -840,4 +836,3 @@ cannot create TLS data structures"));
|
|||
listp->slotinfo[idx].map = l;
|
||||
listp->slotinfo[idx].gen = GL(dl_tls_generation) + 1;
|
||||
}
|
||||
#endif /* use TLS */
|
||||
|
|
|
|||
|
|
@ -1196,9 +1196,7 @@ main (int argc, char **argv)
|
|||
add_dir (argv[i]);
|
||||
}
|
||||
|
||||
#ifdef USE_TLS
|
||||
hwcap_extra[63 - _DL_FIRST_EXTRA] = "tls";
|
||||
#endif
|
||||
|
||||
set_hwcap ();
|
||||
|
||||
|
|
|
|||
53
elf/rtld.c
53
elf/rtld.c
|
|
@ -1,5 +1,5 @@
|
|||
/* Run time dynamic linker.
|
||||
Copyright (C) 1995-2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
|
||||
Copyright (C) 1995-2002,2003,2004,2005,2006 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
|
||||
|
|
@ -207,8 +207,7 @@ DL_SYSINFO_IMPLEMENTATION
|
|||
is fine, too. The latter is important here. We can avoid setting
|
||||
up a temporary link map for ld.so if we can mark _rtld_global as
|
||||
hidden. */
|
||||
#if defined PI_STATIC_AND_HIDDEN && defined HAVE_HIDDEN \
|
||||
&& defined HAVE_VISIBILITY_ATTRIBUTE
|
||||
#ifdef PI_STATIC_AND_HIDDEN
|
||||
# define DONT_USE_BOOTSTRAP_MAP 1
|
||||
#endif
|
||||
|
||||
|
|
@ -292,7 +291,7 @@ _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_text_end = (ElfW(Addr)) _etext;
|
||||
/* Copy the TLS related data if necessary. */
|
||||
#if USE_TLS && !defined DONT_USE_BOOTSTRAP_MAP
|
||||
#ifndef DONT_USE_BOOTSTRAP_MAP
|
||||
# if USE___THREAD
|
||||
assert (info->l.l_tls_modid != 0);
|
||||
GL(dl_rtld_map).l_tls_blocksize = info->l.l_tls_blocksize;
|
||||
|
|
@ -400,7 +399,7 @@ _dl_start (void *arg)
|
|||
bootstrap_map.l_ld = (void *) bootstrap_map.l_addr + elf_machine_dynamic ();
|
||||
elf_get_dynamic_info (&bootstrap_map, NULL);
|
||||
|
||||
#if defined USE_TLS && NO_TLS_OFFSET != 0
|
||||
#if NO_TLS_OFFSET != 0
|
||||
bootstrap_map.l_tls_offset = NO_TLS_OFFSET;
|
||||
#endif
|
||||
|
||||
|
|
@ -701,7 +700,6 @@ match_version (const char *string, struct link_map *map)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifdef USE_TLS
|
||||
static bool tls_init_tp_called;
|
||||
|
||||
static void *
|
||||
|
|
@ -773,7 +771,6 @@ cannot allocate TLS data structures for initial thread");
|
|||
|
||||
return tcbp;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef _LIBC_REENTRANT
|
||||
/* _dl_error_catch_tsd points to this for the single-threaded case.
|
||||
|
|
@ -861,18 +858,14 @@ dl_main (const ElfW(Phdr) *phdr,
|
|||
hp_timing_t stop;
|
||||
hp_timing_t diff;
|
||||
#endif
|
||||
#ifdef USE_TLS
|
||||
void *tcbp = NULL;
|
||||
#endif
|
||||
|
||||
#ifdef _LIBC_REENTRANT
|
||||
/* Explicit initialization since the reloc would just be more work. */
|
||||
GL(dl_error_catch_tsd) = &_dl_initial_error_catch_tsd;
|
||||
#endif
|
||||
|
||||
#ifdef USE_TLS
|
||||
GL(dl_init_static_tls) = &_dl_nothread_init_static_tls;
|
||||
#endif
|
||||
|
||||
#if defined SHARED && defined _LIBC_REENTRANT \
|
||||
&& defined __rtld_lock_default_lock_recursive
|
||||
|
|
@ -1157,7 +1150,6 @@ of this helper program; chances are you did not intend to run this program.\n\
|
|||
break;
|
||||
|
||||
case PT_TLS:
|
||||
#ifdef USE_TLS
|
||||
if (ph->p_memsz > 0)
|
||||
{
|
||||
/* Note that in the case the dynamic linker we duplicate work
|
||||
|
|
@ -1177,10 +1169,6 @@ of this helper program; chances are you did not intend to run this program.\n\
|
|||
/* This image gets the ID one. */
|
||||
GL(dl_tls_max_dtv_idx) = main_map->l_tls_modid = 1;
|
||||
}
|
||||
#else
|
||||
_dl_fatal_printf ("\
|
||||
ld.so does not support TLS, but program uses it!\n");
|
||||
#endif
|
||||
break;
|
||||
|
||||
case PT_GNU_STACK:
|
||||
|
|
@ -1192,13 +1180,12 @@ ld.so does not support TLS, but program uses it!\n");
|
|||
main_map->l_relro_size = ph->p_memsz;
|
||||
break;
|
||||
}
|
||||
#ifdef USE_TLS
|
||||
/* Adjust the address of the TLS initialization image in case
|
||||
the executable is actually an ET_DYN object. */
|
||||
if (main_map->l_tls_initimage != NULL)
|
||||
main_map->l_tls_initimage
|
||||
= (char *) main_map->l_tls_initimage + main_map->l_addr;
|
||||
#endif
|
||||
|
||||
/* Adjust the address of the TLS initialization image in case
|
||||
the executable is actually an ET_DYN object. */
|
||||
if (main_map->l_tls_initimage != NULL)
|
||||
main_map->l_tls_initimage
|
||||
= (char *) main_map->l_tls_initimage + main_map->l_addr;
|
||||
if (! main_map->l_map_end)
|
||||
main_map->l_map_end = ~0;
|
||||
if (! main_map->l_text_end)
|
||||
|
|
@ -1401,12 +1388,10 @@ ld.so does not support TLS, but program uses it!\n");
|
|||
break;
|
||||
}
|
||||
|
||||
#ifdef USE_TLS
|
||||
/* Add the dynamic linker to the TLS list if it also uses TLS. */
|
||||
if (GL(dl_rtld_map).l_tls_blocksize != 0)
|
||||
/* Assign a module ID. Do this before loading any audit modules. */
|
||||
GL(dl_rtld_map).l_tls_modid = _dl_next_tls_modid ();
|
||||
#endif
|
||||
|
||||
/* If we have auditing DSOs to load, do it now. */
|
||||
if (__builtin_expect (audit_list != NULL, 0))
|
||||
|
|
@ -1416,7 +1401,6 @@ ld.so does not support TLS, but program uses it!\n");
|
|||
struct audit_list *al = audit_list->next;
|
||||
do
|
||||
{
|
||||
#ifdef USE_TLS
|
||||
int tls_idx = GL(dl_tls_max_dtv_idx);
|
||||
|
||||
/* Now it is time to determine the layout of the static TLS
|
||||
|
|
@ -1428,7 +1412,7 @@ ld.so does not support TLS, but program uses it!\n");
|
|||
/* Since we start using the auditing DSOs right away we need to
|
||||
initialize the data structures now. */
|
||||
tcbp = init_tls ();
|
||||
#endif
|
||||
|
||||
struct dlmopen_args dlmargs;
|
||||
dlmargs.fname = al->name;
|
||||
dlmargs.map = NULL;
|
||||
|
|
@ -1543,9 +1527,7 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n",
|
|||
assert (GL(dl_ns)[ns]._ns_loaded == NULL);
|
||||
assert (GL(dl_ns)[ns]._ns_nloaded == 0);
|
||||
|
||||
#ifdef USE_TLS
|
||||
GL(dl_tls_max_dtv_idx) = tls_idx;
|
||||
#endif
|
||||
goto not_loaded;
|
||||
}
|
||||
}
|
||||
|
|
@ -1821,7 +1803,6 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n",
|
|||
_dl_receive_error (print_missing_version, version_check_doit, &args);
|
||||
}
|
||||
|
||||
#ifdef USE_TLS
|
||||
/* We do not initialize any of the TLS functionality unless any of the
|
||||
initial modules uses TLS. This makes dynamic loading of modules with
|
||||
TLS impossible, but to support it requires either eagerly doing setup
|
||||
|
|
@ -1832,7 +1813,6 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n",
|
|||
bool was_tls_init_tp_called = tls_init_tp_called;
|
||||
if (tcbp == NULL)
|
||||
tcbp = init_tls ();
|
||||
#endif
|
||||
|
||||
/* Set up the stack checker's canary. */
|
||||
uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard ();
|
||||
|
|
@ -1889,13 +1869,12 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n",
|
|||
(size_t) l->l_map_start,
|
||||
(int) sizeof l->l_addr * 2,
|
||||
(size_t) l->l_addr);
|
||||
#ifdef USE_TLS
|
||||
|
||||
if (l->l_tls_modid)
|
||||
_dl_printf (" TLS(0x%Zx, 0x%0*Zx)\n", l->l_tls_modid,
|
||||
(int) sizeof l->l_tls_offset * 2,
|
||||
(size_t) l->l_tls_offset);
|
||||
else
|
||||
#endif
|
||||
_dl_printf ("\n");
|
||||
}
|
||||
}
|
||||
|
|
@ -2178,11 +2157,9 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n",
|
|||
if (l->l_relro_size)
|
||||
_dl_protect_relro (l);
|
||||
|
||||
#ifdef USE_TLS
|
||||
/* Add object to slot information data if necessasy. */
|
||||
if (l->l_tls_blocksize != 0 && tls_init_tp_called)
|
||||
_dl_add_to_slotinfo (l);
|
||||
#endif
|
||||
}
|
||||
|
||||
_dl_sysdep_start_cleanup ();
|
||||
|
|
@ -2229,11 +2206,9 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n",
|
|||
_dl_relocate_object (l, l->l_scope, GLRO(dl_lazy),
|
||||
consider_profiling);
|
||||
|
||||
#ifdef USE_TLS
|
||||
/* Add object to slot information data if necessasy. */
|
||||
if (l->l_tls_blocksize != 0 && tls_init_tp_called)
|
||||
_dl_add_to_slotinfo (l);
|
||||
#endif
|
||||
|
||||
l = l->l_prev;
|
||||
}
|
||||
|
|
@ -2262,7 +2237,6 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n",
|
|||
# define NONTLS_INIT_TP do { } while (0)
|
||||
#endif
|
||||
|
||||
#ifdef USE_TLS
|
||||
if (!was_tls_init_tp_called && GL(dl_tls_max_dtv_idx) > 0)
|
||||
++GL(dl_tls_generation);
|
||||
|
||||
|
|
@ -2280,9 +2254,6 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n",
|
|||
_dl_fatal_printf ("cannot set up thread-local storage: %s\n",
|
||||
lossage);
|
||||
}
|
||||
#else
|
||||
NONTLS_INIT_TP;
|
||||
#endif
|
||||
|
||||
if (! prelinked && rtld_multiple_ref)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -0,0 +1,59 @@
|
|||
#include <dlfcn.h>
|
||||
#include <pthread.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <gnu/lib-names.h>
|
||||
|
||||
static void *
|
||||
tf (void *arg)
|
||||
{
|
||||
void *h = dlopen (LIBM_SO, RTLD_LAZY);
|
||||
if (h == NULL)
|
||||
{
|
||||
printf ("dlopen failed: %s\n", dlerror ());
|
||||
exit (1);
|
||||
}
|
||||
if (dlsym (h, "sin") == NULL)
|
||||
{
|
||||
printf ("dlsym failed: %s\n", dlerror ());
|
||||
exit (1);
|
||||
}
|
||||
if (dlclose (h) != 0)
|
||||
{
|
||||
printf ("dlclose failed: %s\n", dlerror ());
|
||||
exit (1);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
do_test (void)
|
||||
{
|
||||
#define N 10
|
||||
pthread_t th[N];
|
||||
for (int i = 0; i < N; ++i)
|
||||
{
|
||||
int e = pthread_create (&th[i], NULL, tf, NULL);
|
||||
if (e != 0)
|
||||
{
|
||||
printf ("pthread_create failed with %d (%s)\n", e, strerror (e));
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < N; ++i)
|
||||
{
|
||||
void *res;
|
||||
int e = pthread_join (th[i], &res);
|
||||
if (e != 0 || res != NULL)
|
||||
{
|
||||
puts ("thread failed");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define TEST_FUNCTION do_test ()
|
||||
#include "../test-skeleton.c"
|
||||
|
|
@ -9,7 +9,6 @@
|
|||
static int
|
||||
do_test (void)
|
||||
{
|
||||
#ifdef USE_TLS
|
||||
static const char modname[] = "tst-tlsmod2.so";
|
||||
int result = 0;
|
||||
int *foop;
|
||||
|
|
@ -83,9 +82,6 @@ do_test (void)
|
|||
dlclose (h);
|
||||
|
||||
return result;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -3,21 +3,18 @@
|
|||
|
||||
#include <tls.h>
|
||||
|
||||
#ifdef USE_TLS
|
||||
# include "tls-macros.h"
|
||||
#include "tls-macros.h"
|
||||
|
||||
|
||||
/* Two common 'int' variables in TLS. */
|
||||
COMMON_INT_DEF(foo);
|
||||
COMMON_INT_DEF(bar);
|
||||
#endif
|
||||
|
||||
|
||||
#define TEST_FUNCTION do_test ()
|
||||
static int
|
||||
do_test (void)
|
||||
{
|
||||
#ifdef USE_TLS
|
||||
int result = 0;
|
||||
int *ap, *bp;
|
||||
|
||||
|
|
@ -82,9 +79,6 @@ do_test (void)
|
|||
}
|
||||
|
||||
return result;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,7 @@
|
|||
#include <tls.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#if defined USE_TLS && defined HAVE___THREAD \
|
||||
&& defined HAVE_TLS_MODEL_ATTRIBUTE
|
||||
#if defined HAVE___THREAD && defined HAVE_TLS_MODEL_ATTRIBUTE
|
||||
# define USE_TLS__THREAD
|
||||
|
||||
struct A
|
||||
|
|
|
|||
|
|
@ -6,9 +6,9 @@
|
|||
|
||||
#include <tls.h>
|
||||
|
||||
#if USE_TLS && HAVE___THREAD
|
||||
#if HAVE___THREAD
|
||||
|
||||
#define AL 4096
|
||||
# define AL 4096
|
||||
struct foo
|
||||
{
|
||||
int i;
|
||||
|
|
@ -55,11 +55,11 @@ do_test (void)
|
|||
return result;
|
||||
}
|
||||
|
||||
#define TEST_FUNCTION do_test ()
|
||||
# define TEST_FUNCTION do_test ()
|
||||
|
||||
#else
|
||||
|
||||
#define TEST_FUNCTION 0
|
||||
# define TEST_FUNCTION 0
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -3,21 +3,18 @@
|
|||
|
||||
#include <tls.h>
|
||||
|
||||
#ifdef USE_TLS
|
||||
# include "tls-macros.h"
|
||||
#include "tls-macros.h"
|
||||
|
||||
|
||||
/* Two 'int' variables in TLS. */
|
||||
VAR_INT_DEF(foo);
|
||||
VAR_INT_DEF(bar);
|
||||
#endif
|
||||
|
||||
|
||||
#define TEST_FUNCTION do_test ()
|
||||
static int
|
||||
do_test (void)
|
||||
{
|
||||
#ifdef USE_TLS
|
||||
int result = 0;
|
||||
int *ap, *bp;
|
||||
|
||||
|
|
@ -82,9 +79,6 @@ do_test (void)
|
|||
}
|
||||
|
||||
return result;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -3,15 +3,13 @@
|
|||
|
||||
#include <tls.h>
|
||||
|
||||
#ifdef USE_TLS
|
||||
# include "tls-macros.h"
|
||||
#include "tls-macros.h"
|
||||
|
||||
|
||||
/* One define int variable, two externs. */
|
||||
COMMON_INT_DECL(foo);
|
||||
VAR_INT_DECL(bar);
|
||||
VAR_INT_DEF(baz);
|
||||
#endif
|
||||
|
||||
|
||||
extern int in_dso (void);
|
||||
|
|
@ -21,7 +19,6 @@ extern int in_dso (void);
|
|||
static int
|
||||
do_test (void)
|
||||
{
|
||||
#ifdef USE_TLS
|
||||
int result = 0;
|
||||
int *ap, *bp, *cp;
|
||||
|
||||
|
|
@ -67,9 +64,6 @@ do_test (void)
|
|||
result |= in_dso ();
|
||||
|
||||
return result;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@
|
|||
static int
|
||||
do_test (void)
|
||||
{
|
||||
#ifdef USE_TLS
|
||||
static const char modname[] = "tst-tlsmod2.so";
|
||||
int result = 0;
|
||||
int *foop;
|
||||
|
|
@ -47,9 +46,6 @@ do_test (void)
|
|||
dlclose (h);
|
||||
|
||||
return result;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@
|
|||
static int
|
||||
do_test (void)
|
||||
{
|
||||
#ifdef USE_TLS
|
||||
static const char modname[] = "tst-tlsmod2.so";
|
||||
int result = 0;
|
||||
int *foop;
|
||||
|
|
@ -63,9 +62,6 @@ do_test (void)
|
|||
dlclose (h);
|
||||
|
||||
return result;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -10,7 +10,6 @@
|
|||
static int
|
||||
do_test (void)
|
||||
{
|
||||
#ifdef USE_TLS
|
||||
static const char modname[] = "tst-tlsmod2.so";
|
||||
int result = 0;
|
||||
int *foop;
|
||||
|
|
@ -81,9 +80,6 @@ do_test (void)
|
|||
}
|
||||
|
||||
return result;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -10,7 +10,6 @@
|
|||
static int
|
||||
do_test (void)
|
||||
{
|
||||
#ifdef USE_TLS
|
||||
static const char modname[] = "tst-tlsmod3.so";
|
||||
int result = 0;
|
||||
int (*fp) (void);
|
||||
|
|
@ -52,9 +51,6 @@ do_test (void)
|
|||
}
|
||||
|
||||
return result;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -10,7 +10,6 @@
|
|||
static int
|
||||
do_test (void)
|
||||
{
|
||||
#ifdef USE_TLS
|
||||
static const char modname1[] = "$ORIGIN/tst-tlsmod3.so";
|
||||
static const char modname2[] = "$ORIGIN/tst-tlsmod4.so";
|
||||
int result = 0;
|
||||
|
|
@ -165,9 +164,6 @@ do_test (void)
|
|||
}
|
||||
|
||||
return result;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@
|
|||
static int
|
||||
do_test (void)
|
||||
{
|
||||
#ifdef USE_TLS
|
||||
static const char modname1[] = "tst-tlsmod5.so";
|
||||
static const char modname2[] = "tst-tlsmod6.so";
|
||||
int result = 0;
|
||||
|
|
@ -33,9 +32,6 @@ do_test (void)
|
|||
dlclose (h2);
|
||||
|
||||
return result;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
|
||||
#include <tls.h>
|
||||
|
||||
#ifdef USE_TLS
|
||||
#include "tls-macros.h"
|
||||
|
||||
|
||||
|
|
@ -10,7 +9,6 @@
|
|||
COMMON_INT_DEF(foo);
|
||||
VAR_INT_DEF(bar);
|
||||
VAR_INT_DECL(baz);
|
||||
#endif
|
||||
|
||||
extern int in_dso (void);
|
||||
|
||||
|
|
@ -18,7 +16,6 @@ int
|
|||
in_dso (void)
|
||||
{
|
||||
int result = 0;
|
||||
#ifdef USE_TLS
|
||||
int *ap, *bp, *cp;
|
||||
|
||||
/* Get variables using initial exec model. */
|
||||
|
|
@ -62,7 +59,6 @@ in_dso (void)
|
|||
printf ("baz = %d\n", *cp);
|
||||
result = 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
return result;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
#include <tls.h>
|
||||
|
||||
#if defined USE_TLS && defined HAVE___THREAD \
|
||||
&& defined HAVE_TLS_MODEL_ATTRIBUTE
|
||||
#if defined HAVE___THREAD && defined HAVE_TLS_MODEL_ATTRIBUTE
|
||||
__thread int a[2] __attribute__ ((tls_model ("initial-exec")));
|
||||
#else
|
||||
int a[2];
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
#include <tls.h>
|
||||
|
||||
#if defined USE_TLS && defined HAVE___THREAD \
|
||||
&& defined HAVE_TLS_MODEL_ATTRIBUTE
|
||||
#if defined HAVE___THREAD && defined HAVE_TLS_MODEL_ATTRIBUTE
|
||||
__thread int b[2] __attribute__ ((tls_model ("initial-exec")));
|
||||
#else
|
||||
int b[2];
|
||||
|
|
|
|||
|
|
@ -3,9 +3,9 @@
|
|||
|
||||
#include <tls.h>
|
||||
|
||||
#if USE_TLS && HAVE___THREAD
|
||||
#if HAVE___THREAD
|
||||
|
||||
#define AL 4096
|
||||
# define AL 4096
|
||||
struct foo
|
||||
{
|
||||
int i;
|
||||
|
|
@ -15,9 +15,9 @@ static __thread struct foo f;
|
|||
static struct foo g;
|
||||
|
||||
|
||||
#ifndef FCT
|
||||
# define FCT in_dso1
|
||||
#endif
|
||||
# ifndef FCT
|
||||
# define FCT in_dso1
|
||||
# endif
|
||||
|
||||
|
||||
int
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
|
||||
#include <tls.h>
|
||||
|
||||
#ifdef USE_TLS
|
||||
#include "tls-macros.h"
|
||||
|
||||
|
||||
|
|
@ -35,4 +34,3 @@ in_dso (int n, int *caller_foop)
|
|||
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -2,8 +2,7 @@
|
|||
|
||||
#include <tls.h>
|
||||
|
||||
#ifdef USE_TLS
|
||||
# include "tls-macros.h"
|
||||
#include "tls-macros.h"
|
||||
|
||||
extern int in_dso (int n, int *caller_foop);
|
||||
|
||||
|
|
@ -38,4 +37,3 @@ in_dso2 (void)
|
|||
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -2,8 +2,7 @@
|
|||
|
||||
#include <tls.h>
|
||||
|
||||
#ifdef USE_TLS
|
||||
# include "tls-macros.h"
|
||||
#include "tls-macros.h"
|
||||
|
||||
|
||||
COMMON_INT_DEF(baz);
|
||||
|
|
@ -35,4 +34,3 @@ in_dso (int n, int *caller_bazp)
|
|||
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1,7 +1,5 @@
|
|||
#include <tls.h>
|
||||
|
||||
#ifdef USE_TLS
|
||||
#include "tls-macros.h"
|
||||
|
||||
COMMON_INT_DEF(foo);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1,7 +1,5 @@
|
|||
#include <tls.h>
|
||||
|
||||
#ifdef USE_TLS
|
||||
#include "tls-macros.h"
|
||||
|
||||
COMMON_INT_DEF(bar);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -3,5 +3,5 @@ glibc-branch := fedora
|
|||
glibc-base := HEAD
|
||||
DIST_BRANCH := devel
|
||||
COLLECTION := dist-fc4
|
||||
fedora-sync-date := 2006-10-27 19:02 UTC
|
||||
fedora-sync-tag := fedora-glibc-20061027T1902
|
||||
fedora-sync-date := 2006-10-29 21:55 UTC
|
||||
fedora-sync-tag := fedora-glibc-20061029T2155
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
%define glibcrelease 2
|
||||
%define glibcrelease 3
|
||||
%define auxarches i586 i686 athlon sparcv9 alphaev6
|
||||
%define xenarches i686 athlon
|
||||
%ifarch %{xenarches}
|
||||
|
|
@ -1528,6 +1528,9 @@ rm -f *.filelist*
|
|||
%endif
|
||||
|
||||
%changelog
|
||||
* Sun Oct 29 2006 Jakub Jelinek <jakub@redhat.com> 2.5.90-3
|
||||
- fix suid/sgid binaries on i?86/x86_64 (#212723)
|
||||
|
||||
* Fri Oct 27 2006 Jakub Jelinek <jakub@redhat.com> 2.5.90-2
|
||||
- fix ia64 build
|
||||
- don't call _dl_close outside of dl_load_lock critical section
|
||||
|
|
|
|||
|
|
@ -47,6 +47,9 @@ libc_hidden_proto (_dl_addr)
|
|||
|
||||
/* Close an object previously opened by _dl_open. */
|
||||
extern void _dl_close (void *map) attribute_hidden;
|
||||
/* Same as above, but without locking and safety checks for user
|
||||
provided map arguments. */
|
||||
extern void _dl_close_worker (struct link_map *map) attribute_hidden;
|
||||
|
||||
/* Look up NAME in shared object HANDLE (which may be RTLD_DEFAULT or
|
||||
RTLD_NEXT). WHO is the calling function, for RTLD_NEXT. Returns
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ extern int rtld_errno attribute_hidden;
|
|||
|
||||
# else
|
||||
|
||||
# include <tls.h> /* Defines USE_TLS. */
|
||||
# include <tls.h>
|
||||
|
||||
# if USE___THREAD
|
||||
# undef errno
|
||||
|
|
|
|||
|
|
@ -114,6 +114,13 @@
|
|||
# define _weak_alias(name, aliasname) \
|
||||
extern __typeof (name) aliasname __attribute__ ((weak, alias (#name)));
|
||||
|
||||
/* Same as WEAK_ALIAS, but mark symbol as hidden. */
|
||||
# define weak_hidden_alias(name, aliasname) \
|
||||
_weak_hidden_alias (name, aliasname)
|
||||
# define _weak_hidden_alias(name, aliasname) \
|
||||
extern __typeof (name) aliasname \
|
||||
__attribute__ ((weak, alias (#name), __visibility__ ("hidden")));
|
||||
|
||||
/* Declare SYMBOL as weak undefined symbol (resolved to 0 if not defined). */
|
||||
# define weak_extern(symbol) _weak_extern (weak symbol)
|
||||
# define _weak_extern(expr) _Pragma (#expr)
|
||||
|
|
@ -121,6 +128,7 @@
|
|||
# else
|
||||
|
||||
# define weak_alias(name, aliasname) strong_alias(name, aliasname)
|
||||
# define weak_hidden_alias(name, aliasname) strong_alias(name, aliasname)
|
||||
# define weak_extern(symbol) /* Nothing. */
|
||||
|
||||
# endif
|
||||
|
|
@ -431,8 +439,7 @@ for linking")
|
|||
strong_alias(real, name)
|
||||
#endif
|
||||
|
||||
#if defined HAVE_VISIBILITY_ATTRIBUTE \
|
||||
&& (defined SHARED || defined LIBC_NONSHARED)
|
||||
#if defined SHARED || defined LIBC_NONSHARED
|
||||
# define attribute_hidden __attribute__ ((visibility ("hidden")))
|
||||
#else
|
||||
# define attribute_hidden
|
||||
|
|
@ -444,11 +451,7 @@ for linking")
|
|||
# define attribute_tls_model_ie
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_Z_RELRO
|
||||
# define attribute_relro __attribute__ ((section (".data.rel.ro")))
|
||||
#else
|
||||
# define attribute_relro
|
||||
#endif
|
||||
#define attribute_relro __attribute__ ((section (".data.rel.ro")))
|
||||
|
||||
/* Handling on non-exported internal names. We have to do this only
|
||||
for shared code. */
|
||||
|
|
@ -457,14 +460,9 @@ for linking")
|
|||
# define INTDEF(name) strong_alias (name, name##_internal)
|
||||
# define INTVARDEF(name) \
|
||||
_INTVARDEF (name, name##_internal)
|
||||
# if defined HAVE_VISIBILITY_ATTRIBUTE
|
||||
# define _INTVARDEF(name, aliasname) \
|
||||
# define _INTVARDEF(name, aliasname) \
|
||||
extern __typeof (name) aliasname __attribute__ ((alias (#name), \
|
||||
visibility ("hidden")));
|
||||
# else
|
||||
# define _INTVARDEF(name, aliasname) \
|
||||
extern __typeof (name) aliasname __attribute__ ((alias (#name)));
|
||||
# endif
|
||||
# define INTDEF2(name, newname) strong_alias (name, newname##_internal)
|
||||
# define INTVARDEF2(name, newname) _INTVARDEF (name, newname##_internal)
|
||||
#else
|
||||
|
|
@ -549,16 +547,10 @@ for linking")
|
|||
versioned_symbol (libc, __real_foo, foo, GLIBC_2_1);
|
||||
libc_hidden_ver (__real_foo, foo) */
|
||||
|
||||
#if defined SHARED && defined DO_VERSIONING \
|
||||
&& !defined HAVE_BROKEN_ALIAS_ATTRIBUTE && !defined NO_HIDDEN
|
||||
#if defined SHARED && defined DO_VERSIONING && !defined NO_HIDDEN
|
||||
# ifndef __ASSEMBLER__
|
||||
# if !defined HAVE_VISIBILITY_ATTRIBUTE \
|
||||
|| defined HAVE_BROKEN_VISIBILITY_ATTRIBUTE
|
||||
# define __hidden_proto_hiddenattr(attrs...)
|
||||
# else
|
||||
# define __hidden_proto_hiddenattr(attrs...) \
|
||||
# define __hidden_proto_hiddenattr(attrs...) \
|
||||
__attribute__ ((visibility ("hidden"), ##attrs))
|
||||
# endif
|
||||
# define hidden_proto(name, attrs...) \
|
||||
__hidden_proto (name, __GI_##name, ##attrs)
|
||||
# define __hidden_proto(name, internal, attrs...) \
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ extern unsigned int la_objopen (struct link_map *__map, Lmid_t __lmid,
|
|||
#include <stddef.h>
|
||||
#include <bits/linkmap.h>
|
||||
#include <dl-lookupcfg.h>
|
||||
#include <tls.h> /* Defines USE_TLS. */
|
||||
#include <tls.h>
|
||||
#include <bits/libc-lock.h>
|
||||
#include <rtld-lowlevel.h>
|
||||
|
||||
|
|
@ -261,7 +261,6 @@ struct link_map
|
|||
const ElfW(Sym) *ret;
|
||||
} l_lookup_cache;
|
||||
|
||||
#ifdef USE_TLS
|
||||
/* Thread-local storage related info. */
|
||||
|
||||
/* Start of the initialization image. */
|
||||
|
|
@ -274,14 +273,13 @@ struct link_map
|
|||
size_t l_tls_align;
|
||||
/* Offset of first byte module alignment. */
|
||||
size_t l_tls_firstbyte_offset;
|
||||
# ifndef NO_TLS_OFFSET
|
||||
# define NO_TLS_OFFSET 0
|
||||
# endif
|
||||
#ifndef NO_TLS_OFFSET
|
||||
# define NO_TLS_OFFSET 0
|
||||
#endif
|
||||
/* For objects present at startup time: offset in the static TLS block. */
|
||||
ptrdiff_t l_tls_offset;
|
||||
/* Index of the module in the dtv array. */
|
||||
size_t l_tls_modid;
|
||||
#endif
|
||||
|
||||
/* Information used to change permission after the relocations are
|
||||
done. */
|
||||
|
|
|
|||
|
|
@ -131,7 +131,6 @@ libc_hidden_proto (__vsnprintf_chk)
|
|||
libc_hidden_proto (__vfprintf_chk)
|
||||
|
||||
# if !defined NOT_IN_libc && defined SHARED && defined DO_VERSIONING \
|
||||
&& defined HAVE_VISIBILITY_ATTRIBUTE && !defined HAVE_BROKEN_ALIAS_ATTRIBUTE\
|
||||
&& !defined NO_HIDDEN
|
||||
/* Special gcc builtins. */
|
||||
extern size_t __builtin_fwrite (const void *, size_t, size_t, void *)
|
||||
|
|
|
|||
|
|
@ -5,8 +5,7 @@
|
|||
|
||||
#include_next <tls.h>
|
||||
|
||||
#if USE_TLS && HAVE___THREAD \
|
||||
&& (!defined NOT_IN_libc || defined IS_IN_libpthread)
|
||||
#if HAVE___THREAD && (!defined NOT_IN_libc || defined IS_IN_libpthread)
|
||||
|
||||
# define USE___THREAD 1
|
||||
|
||||
|
|
|
|||
13
io/Makefile
13
io/Makefile
|
|
@ -90,19 +90,6 @@ CFLAGS-posix_fallocate64.c = -fexceptions
|
|||
CFLAGS-test-stat.c = -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE
|
||||
CFLAGS-test-lfs.c = -D_LARGEFILE64_SOURCE
|
||||
|
||||
ifeq (yes,$(have-protected))
|
||||
CFLAGS-stat.c = -DHAVE_DOT_HIDDEN
|
||||
CFLAGS-fstat.c = -DHAVE_DOT_HIDDEN
|
||||
CFLAGS-lstat.c = -DHAVE_DOT_HIDDEN
|
||||
CFLAGS-mknod.c = -DHAVE_DOT_HIDDEN
|
||||
CFLAGS-stat64.c = -DHAVE_DOT_HIDDEN
|
||||
CFLAGS-fstat64.c = -DHAVE_DOT_HIDDEN
|
||||
CFLAGS-lstat64.c = -DHAVE_DOT_HIDDEN
|
||||
CFLAGS-fstatat.c = -DHAVE_DOT_HIDDEN
|
||||
CFLAGS-fstatat64.c = -DHAVE_DOT_HIDDEN
|
||||
CFLAGS-mknodat.c = -DHAVE_DOT_HIDDEN
|
||||
endif
|
||||
|
||||
test-stat2-ARGS = Makefile . $(objpfx)test-stat2
|
||||
|
||||
tst-statvfs-ARGS = $(objpfx)tst-statvfs tst-statvfs.c /tmp
|
||||
|
|
|
|||
12
io/fstat.c
12
io/fstat.c
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (C) 1996, 1997, 1998, 2001 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1996, 1997, 1998, 2001, 2006 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
|
||||
|
|
@ -47,16 +47,10 @@
|
|||
#undef fstat
|
||||
#undef __fstat
|
||||
int
|
||||
attribute_hidden
|
||||
__fstat (int fd, struct stat *buf)
|
||||
{
|
||||
return __fxstat (_STAT_VER, fd, buf);
|
||||
}
|
||||
|
||||
weak_alias (__fstat, fstat)
|
||||
|
||||
/* Hide the symbol so that no definition but the one locally in the
|
||||
executable or DSO is used. */
|
||||
#ifdef HAVE_DOT_HIDDEN
|
||||
asm (".hidden\tfstat");
|
||||
asm (".hidden\t__fstat");
|
||||
#endif
|
||||
weak_hidden_alias (__fstat, fstat)
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (C) 1996, 1997, 2001 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1996, 1997, 2001, 2006 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
|
||||
|
|
@ -46,13 +46,8 @@
|
|||
|
||||
#undef fstat64
|
||||
int
|
||||
attribute_hidden
|
||||
fstat64 (int fd, struct stat64 *buf)
|
||||
{
|
||||
return __fxstat64 (_STAT_VER, fd, buf);
|
||||
}
|
||||
|
||||
/* Hide the symbol so that no definition but the one locally in the
|
||||
executable or DSO is used. */
|
||||
#ifdef HAVE_DOT_HIDDEN
|
||||
asm (".hidden\tfstat64");
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (C) 2005 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 2005, 2006 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
|
||||
|
|
@ -46,13 +46,8 @@
|
|||
|
||||
#undef fstatat
|
||||
int
|
||||
attribute_hidden
|
||||
fstatat (int fd, const char *file, struct stat *buf, int flag)
|
||||
{
|
||||
return __fxstatat (_STAT_VER, fd, file, buf, flag);
|
||||
}
|
||||
|
||||
/* Hide the symbol so that no definition but the one locally in the
|
||||
executable or DSO is used. */
|
||||
#ifdef HAVE_DOT_HIDDEN
|
||||
asm (".hidden\tfstatat");
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (C) 2005 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 2005, 2006 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
|
||||
|
|
@ -46,13 +46,8 @@
|
|||
|
||||
#undef fstatat64
|
||||
int
|
||||
attribute_hidden
|
||||
fstatat64 (int fd, const char *file, struct stat64 *buf, int flag)
|
||||
{
|
||||
return __fxstatat64 (_STAT_VER, fd, file, buf, flag);
|
||||
}
|
||||
|
||||
/* Hide the symbol so that no definition but the one locally in the
|
||||
executable or DSO is used. */
|
||||
#ifdef HAVE_DOT_HIDDEN
|
||||
asm (".hidden\tfstatat64");
|
||||
#endif
|
||||
|
|
|
|||
12
io/lstat.c
12
io/lstat.c
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (C) 1996, 1997, 2001 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1996, 1997, 2001, 2006 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
|
||||
|
|
@ -47,16 +47,10 @@
|
|||
#undef lstat
|
||||
#undef __lstat
|
||||
int
|
||||
attribute_hidden
|
||||
__lstat (const char *file, struct stat *buf)
|
||||
{
|
||||
return __lxstat (_STAT_VER, file, buf);
|
||||
}
|
||||
|
||||
weak_alias (__lstat, lstat)
|
||||
|
||||
/* Hide the symbol so that no definition but the one locally in the
|
||||
executable or DSO is used. */
|
||||
#ifdef HAVE_DOT_HIDDEN
|
||||
asm (".hidden\tlstat");
|
||||
asm (".hidden\t__lstat");
|
||||
#endif
|
||||
weak_hidden_alias (__lstat, lstat)
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (C) 1996, 1997, 2001 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1996, 1997, 2001, 2006 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
|
||||
|
|
@ -46,13 +46,8 @@
|
|||
|
||||
#undef lstat64
|
||||
int
|
||||
attribute_hidden
|
||||
lstat64 (const char *file, struct stat64 *buf)
|
||||
{
|
||||
return __lxstat64 (_STAT_VER, file, buf);
|
||||
}
|
||||
|
||||
/* Hide the symbol so that no definition but the one locally in the
|
||||
executable or DSO is used. */
|
||||
#ifdef HAVE_DOT_HIDDEN
|
||||
asm (".hidden\tlstat64");
|
||||
#endif
|
||||
|
|
|
|||
12
io/mknod.c
12
io/mknod.c
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (C) 1995, 1996, 2001 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1995, 1996, 2001, 2006 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
|
||||
|
|
@ -47,16 +47,10 @@
|
|||
all callers. */
|
||||
|
||||
int
|
||||
attribute_hidden
|
||||
__mknod (const char *path, mode_t mode, dev_t dev)
|
||||
{
|
||||
return __xmknod (_MKNOD_VER, path, mode, &dev);
|
||||
}
|
||||
|
||||
weak_alias (__mknod, mknod)
|
||||
|
||||
/* Hide the symbol so that no definition but the one locally in the
|
||||
executable or DSO is used. */
|
||||
#ifdef HAVE_DOT_HIDDEN
|
||||
asm (".hidden\tmknod");
|
||||
asm (".hidden\t__mknod");
|
||||
#endif
|
||||
weak_hidden_alias (__mknod, mknod)
|
||||
|
|
|
|||
10
io/mknodat.c
10
io/mknodat.c
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (C) 1995, 1996, 2001, 2005 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1995, 1996, 2001, 2005, 2006 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
|
||||
|
|
@ -47,14 +47,8 @@
|
|||
all callers. */
|
||||
|
||||
int
|
||||
attribute_hidden
|
||||
mknodat (int fd, const char *path, mode_t mode, dev_t dev)
|
||||
{
|
||||
return __xmknodat (_MKNOD_VER, fd, path, mode, &dev);
|
||||
}
|
||||
|
||||
|
||||
/* Hide the symbol so that no definition but the one locally in the
|
||||
executable or DSO is used. */
|
||||
#ifdef HAVE_DOT_HIDDEN
|
||||
asm (".hidden\tmknodat");
|
||||
#endif
|
||||
|
|
|
|||
12
io/stat.c
12
io/stat.c
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (C) 1996, 1997, 2001 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1996, 1997, 2001, 2006 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
|
||||
|
|
@ -46,16 +46,10 @@
|
|||
|
||||
#undef stat
|
||||
int
|
||||
attribute_hidden
|
||||
__stat (const char *file, struct stat *buf)
|
||||
{
|
||||
return __xstat (_STAT_VER, file, buf);
|
||||
}
|
||||
|
||||
weak_alias (__stat, stat)
|
||||
|
||||
/* Hide the symbol so that no definition but the one locally in the
|
||||
executable or DSO is used. */
|
||||
#ifdef HAVE_DOT_HIDDEN
|
||||
asm (".hidden\tstat");
|
||||
asm (".hidden\t__stat");
|
||||
#endif
|
||||
weak_hidden_alias (__stat, stat)
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (C) 1996, 1997, 2001 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1996, 1997, 2001, 2006 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
|
||||
|
|
@ -46,13 +46,8 @@
|
|||
|
||||
#undef stat64
|
||||
int
|
||||
attribute_hidden
|
||||
stat64 (const char *file, struct stat64 *buf)
|
||||
{
|
||||
return __xstat64 (_STAT_VER, file, buf);
|
||||
}
|
||||
|
||||
/* Hide the symbol so that no definition but the one locally in the
|
||||
executable or DSO is used. */
|
||||
#ifdef HAVE_DOT_HIDDEN
|
||||
asm (".hidden\tstat64");
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
/* Copyright (C) 1993,1994,1996,1997,2000,2002 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1993,1994,1996,1997,2000,2002,2006
|
||||
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
|
||||
|
|
@ -40,14 +41,9 @@ _IO_FILE *stderr = (FILE *) &_IO_2_1_stderr_;
|
|||
#undef _IO_stderr
|
||||
#ifdef _LIBC
|
||||
# define AL(name) AL2 (name, _IO_##name)
|
||||
# if defined HAVE_VISIBILITY_ATTRIBUTE
|
||||
# define AL2(name, al) \
|
||||
# define AL2(name, al) \
|
||||
extern __typeof (name) al __attribute__ ((alias (#name), \
|
||||
visibility ("hidden")))
|
||||
# else
|
||||
# define AL2(name, al) \
|
||||
extern __typeof (name) al __attribute__ ((alias (#name)))
|
||||
# endif
|
||||
AL(stdin);
|
||||
AL(stdout);
|
||||
AL(stderr);
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/* Locale object representing the global locale controlled by setlocale.
|
||||
Copyright (C) 2002 Free Software Foundation, Inc.
|
||||
Copyright (C) 2002, 2006 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
|
||||
|
|
@ -60,7 +60,7 @@ struct __locale_struct _nl_global_locale attribute_hidden =
|
|||
};
|
||||
|
||||
#include <tls.h>
|
||||
#if USE_TLS && HAVE___THREAD
|
||||
#if HAVE___THREAD
|
||||
/* The tsd macros don't permit an initializer. */
|
||||
__thread void *__libc_tsd_LOCALE = &_nl_global_locale;
|
||||
#else
|
||||
|
|
|
|||
|
|
@ -215,9 +215,7 @@ __libc_tsd_define (extern, LOCALE)
|
|||
we can use __thread variables. So only in that case do we attempt this. */
|
||||
#if !defined SHARED && defined HAVE___THREAD && defined HAVE_WEAK_SYMBOLS
|
||||
# include <tls.h>
|
||||
# if USE_TLS
|
||||
# define NL_CURRENT_INDIRECT 1
|
||||
# endif
|
||||
# define NL_CURRENT_INDIRECT 1
|
||||
#endif
|
||||
|
||||
#ifdef NL_CURRENT_INDIRECT
|
||||
|
|
|
|||
|
|
@ -149,7 +149,7 @@ int __malloc_initialized = -1;
|
|||
|
||||
static __malloc_ptr_t (*save_malloc_hook) (size_t __size,
|
||||
__const __malloc_ptr_t);
|
||||
# if !defined _LIBC || !defined USE_TLS || (defined SHARED && !USE___THREAD)
|
||||
# if !defined _LIBC || (defined SHARED && !USE___THREAD)
|
||||
static __malloc_ptr_t (*save_memalign_hook) (size_t __align, size_t __size,
|
||||
__const __malloc_ptr_t);
|
||||
# endif
|
||||
|
|
@ -385,7 +385,7 @@ extern struct dl_open_hook *_dl_open_hook;
|
|||
libc_hidden_proto (_dl_open_hook);
|
||||
# endif
|
||||
|
||||
# if defined SHARED && defined USE_TLS && !USE___THREAD
|
||||
# if defined SHARED && !USE___THREAD
|
||||
/* This is called by __pthread_initialize_minimal when it needs to use
|
||||
malloc to set up the TLS state. We cannot do the full work of
|
||||
ptmalloc_init (below) until __pthread_initialize_minimal has finished,
|
||||
|
|
@ -428,7 +428,7 @@ ptmalloc_init (void)
|
|||
__malloc_initialized = 0;
|
||||
|
||||
#ifdef _LIBC
|
||||
# if defined SHARED && defined USE_TLS && !USE___THREAD
|
||||
# if defined SHARED && !USE___THREAD
|
||||
/* ptmalloc_init_minimal may already have been called via
|
||||
__libc_malloc_pthread_startup, above. */
|
||||
if (mp_.pagesize == 0)
|
||||
|
|
@ -437,7 +437,7 @@ ptmalloc_init (void)
|
|||
ptmalloc_init_minimal();
|
||||
|
||||
#ifndef NO_THREADS
|
||||
# if defined _LIBC && defined USE_TLS
|
||||
# if defined _LIBC
|
||||
/* We know __pthread_initialize_minimal has already been called,
|
||||
and that is enough. */
|
||||
# define NO_STARTER
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/* Malloc implementation for multiple threads without lock contention.
|
||||
Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
|
||||
Copyright (C) 2001,2002,2003,2004,2005,2006 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Wolfram Gloger <wg@malloc.de>, 2001.
|
||||
|
||||
|
|
@ -414,7 +414,7 @@ memalign_check(alignment, bytes, caller)
|
|||
#ifndef NO_THREADS
|
||||
|
||||
# ifdef _LIBC
|
||||
# if USE___THREAD || (defined USE_TLS && !defined SHARED)
|
||||
# if USE___THREAD || !defined SHARED
|
||||
/* These routines are never needed in this configuration. */
|
||||
# define NO_STARTER
|
||||
# endif
|
||||
|
|
|
|||
|
|
@ -1618,7 +1618,7 @@ static Void_t* memalign_check(size_t alignment, size_t bytes,
|
|||
const Void_t *caller);
|
||||
#ifndef NO_THREADS
|
||||
# ifdef _LIBC
|
||||
# if USE___THREAD || (defined USE_TLS && !defined SHARED)
|
||||
# if USE___THREAD || !defined SHARED
|
||||
/* These routines are never needed in this configuration. */
|
||||
# define NO_STARTER
|
||||
# endif
|
||||
|
|
|
|||
|
|
@ -1,3 +1,63 @@
|
|||
2006-10-29 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* sysdeps/unix/sysv/linux/i386/sysdep-cancel.h (RTLD_SINGLE_THREAD_P):
|
||||
Define.
|
||||
(SINGLE_THREAD_P): Define to 1 if IS_IN_rtld.
|
||||
* sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h: Likewise.
|
||||
* sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h: Likewise.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h: Likewise.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h: Likewise.
|
||||
* sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h: Likewise.
|
||||
* sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h: Likewise.
|
||||
* sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h: Likewise.
|
||||
* sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h: Likewise.
|
||||
* sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h: Likewise.
|
||||
* sysdeps/unix/sysv/linux/sh/sysdep-cancel.h: Likewise.
|
||||
|
||||
2006-10-27 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* sysdeps/pthread/pthread_barrier_wait.c: Move to...
|
||||
* pthread_barrier_wait.c: ...here.
|
||||
* sysdeps/pthread/pthread_cond_broadcast.c: Move to...
|
||||
* pthread_cond_broadcast.c: ...here.
|
||||
* sysdeps/pthread/pthread_cond_signal.c: Move to...
|
||||
* pthread_cond_signal.c: ...here.
|
||||
* sysdeps/pthread/pthread_cond_timedwait.c: Move to...
|
||||
* pthread_cond_timedwait.c: ...here.
|
||||
* sysdeps/pthread/pthread_cond_wait.c: Move to...
|
||||
* pthread_cond_wait.c: ...here.
|
||||
* sysdeps/pthread/pthread_once.c: Move to...
|
||||
* pthread_once.c: ...here.
|
||||
* sysdeps/pthread/pthread_rwlock_rdlock.c: Move to...
|
||||
* pthread_rwlock_rdlock.c: ...here.
|
||||
* sysdeps/pthread/pthread_rwlock_timedrdlock.c: Move to...
|
||||
* pthread_rwlock_timedrdlock.c: ...here.
|
||||
* sysdeps/pthread/pthread_rwlock_timedwrlock.c: Move to...
|
||||
* pthread_rwlock_timedwrlock.c: ...here.
|
||||
* sysdeps/pthread/pthread_rwlock_unlock.c: Move to...
|
||||
* pthread_rwlock_unlock.c: ...here.
|
||||
* sysdeps/pthread/pthread_rwlock_wrlock.c: Move to...
|
||||
* pthread_rwlock_wrlock.c: ...here.
|
||||
* sysdeps/pthread/pthread_spin_destroy.c: Move to...
|
||||
* pthread_spin_destroy.c: ...here.
|
||||
* sysdeps/pthread/pthread_spin_init.c: Move to...
|
||||
* pthread_spin_init.c: ...here.
|
||||
* sysdeps/pthread/pthread_spin_unlock.c: Move to...
|
||||
* pthread_spin_unlock.c: ...here.
|
||||
* sysdeps/pthread/pthread_getcpuclockid.c: Move to...
|
||||
* pthread_getcpuclockid.c: ...here.
|
||||
|
||||
* init.c: USE_TLS support is now default.
|
||||
* tst-tls5.h: Likewise.
|
||||
* sysdeps/alpha/tls.h: Likewise.
|
||||
* sysdeps/i386/tls.h: Likewise.
|
||||
* sysdeps/ia64/tls.h: Likewise.
|
||||
* sysdeps/powerpc/tls.h: Likewise.
|
||||
* sysdeps/s390/tls.h: Likewise.
|
||||
* sysdeps/sh/tls.h: Likewise.
|
||||
* sysdeps/sparc/tls.h: Likewise.
|
||||
* sysdeps/x86_64/tls.h: Likewise.
|
||||
|
||||
2006-10-27 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* sysdeps/unix/sysv/linux/rtld-lowlevel.h (__rtld_mrlock_lock,
|
||||
|
|
|
|||
|
|
@ -73,7 +73,7 @@ int __set_robust_list_avail;
|
|||
static const char nptl_version[] __attribute_used__ = VERSION;
|
||||
|
||||
|
||||
#if defined USE_TLS && !defined SHARED
|
||||
#ifndef SHARED
|
||||
extern void __libc_setup_tls (size_t tcbsize, size_t tcbalign);
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/* Definition for thread-local data handling. NPTL/Alpha version.
|
||||
Copyright (C) 2003, 2005 Free Software Foundation, Inc.
|
||||
Copyright (C) 2003, 2005, 2006 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
|
||||
|
|
@ -48,9 +48,6 @@ typedef union dtv
|
|||
# error "TLS support is required."
|
||||
#endif
|
||||
|
||||
/* Signal that TLS support is available. */
|
||||
# define USE_TLS 1
|
||||
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
/* Get system call information. */
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/* Definition for thread-local data handling. nptl/i386 version.
|
||||
Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
|
||||
Copyright (C) 2002, 2003, 2004, 2005, 2006 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
|
||||
|
|
@ -65,9 +65,6 @@ typedef struct
|
|||
# error "TLS support is required."
|
||||
#endif
|
||||
|
||||
/* Signal that TLS support is available. */
|
||||
#define USE_TLS 1
|
||||
|
||||
/* Alignment requirement for the stack. For IA-32 this is governed by
|
||||
the SSE memory functions. */
|
||||
#define STACK_ALIGN 16
|
||||
|
|
|
|||
|
|
@ -61,9 +61,6 @@ register struct pthread *__thread_self __asm__("r13");
|
|||
# error "TLS support is required."
|
||||
#endif
|
||||
|
||||
/* Signal that TLS support is available. */
|
||||
#define USE_TLS 1
|
||||
|
||||
/* Alignment requirement for the stack. */
|
||||
#define STACK_ALIGN 16
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/* Definition for thread-local data handling. NPTL/PowerPC version.
|
||||
Copyright (C) 2003, 2005 Free Software Foundation, Inc.
|
||||
Copyright (C) 2003, 2005, 2006 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
|
||||
|
|
@ -48,9 +48,6 @@ typedef union dtv
|
|||
# error "TLS support is required."
|
||||
#endif
|
||||
|
||||
/* Signal that TLS support is available. */
|
||||
# define USE_TLS 1
|
||||
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
/* Get system call information. */
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/* Definition for thread-local data handling. NPTL/s390 version.
|
||||
Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
|
||||
Copyright (C) 2003, 2004, 2005, 2006 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
|
||||
|
|
@ -66,9 +66,6 @@ typedef struct
|
|||
# error "TLS support is required."
|
||||
#endif
|
||||
|
||||
/* Signal that TLS support is available. */
|
||||
#define USE_TLS 1
|
||||
|
||||
/* Alignment requirement for the stack. For IA-32 this is governed by
|
||||
the SSE memory functions. */
|
||||
#define STACK_ALIGN 16
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/* Definition for thread-local data handling. NPTL/SH version.
|
||||
Copyright (C) 2003, 2005 Free Software Foundation, Inc.
|
||||
Copyright (C) 2003, 2005, 2006 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
|
||||
|
|
@ -56,9 +56,6 @@ typedef struct
|
|||
# error "TLS support is required."
|
||||
#endif
|
||||
|
||||
/* Signal that TLS support is available. */
|
||||
# define USE_TLS 1
|
||||
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
/* Get system call information. */
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue