From 5bbfc1ea7069630149c5fc1b3cec4a044d43a9cd Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Sun, 29 Sep 2002 10:38:40 +0000 Subject: * configure: Regenerated after aclocal.m4 change. * sysdeps/x86_64/sysdep.h [HAVE_ELF] (L): Define with .L##name form. * sysdeps/unix/sysv/linux/x86_64/sysdep.h (L): Don't define it here. * sysdeps/generic/dl-lookupcfg.h [USE_TLS] (DL_LOOKUP_RETURNS_MAP): Define it, because _dl_sym presumes it (for any platform). * sysdeps/x86_64/dl-tls.h: New file. * sysdeps/x86_64/dl-machine.h (elf_machine_rela): Add a cast. * sysdeps/x86_64/elf/configure.in: New file. * sysdeps/x86_64/elf/configure: New generated file. --- sysdeps/generic/dl-lookupcfg.h | 13 +++++++--- sysdeps/unix/sysv/linux/x86_64/sysdep.h | 4 --- sysdeps/x86_64/dl-machine.h | 3 ++- sysdeps/x86_64/dl-tls.h | 29 ++++++++++++++++++++++ sysdeps/x86_64/elf/configure | 43 +++++++++++++++++++++++++++++++++ sysdeps/x86_64/elf/configure.in | 35 +++++++++++++++++++++++++++ sysdeps/x86_64/sysdep.h | 7 +++++- 7 files changed, 125 insertions(+), 9 deletions(-) create mode 100644 sysdeps/x86_64/dl-tls.h create mode 100755 sysdeps/x86_64/elf/configure create mode 100644 sysdeps/x86_64/elf/configure.in (limited to 'sysdeps') diff --git a/sysdeps/generic/dl-lookupcfg.h b/sysdeps/generic/dl-lookupcfg.h index 810e8c7c6a..76c803dcb1 100644 --- a/sysdeps/generic/dl-lookupcfg.h +++ b/sysdeps/generic/dl-lookupcfg.h @@ -1,5 +1,5 @@ /* Configuration of lookup functions. - Copyright (C) 2000 Free Software Foundation, Inc. + Copyright (C) 2002 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -18,5 +18,12 @@ 02111-1307 USA. */ /* Some platforms need more information from the symbol lookup function - than just the address. But this is not generally the case. */ -#undef DL_LOOKUP_RETURNS_MAP + than just the address. But this is not generally the case. + + However, because of how _dl_sym and _dl_tls_symaddr are written, every + platform needs it when we support TLS. */ +#ifdef USE_TLS +# define DL_LOOKUP_RETURNS_MAP +#else +# undef DL_LOOKUP_RETURNS_MAP +#endif diff --git a/sysdeps/unix/sysv/linux/x86_64/sysdep.h b/sysdeps/unix/sysv/linux/x86_64/sysdep.h index eda905fdb5..70aa826b18 100644 --- a/sysdeps/unix/sysv/linux/x86_64/sysdep.h +++ b/sysdeps/unix/sysv/linux/x86_64/sysdep.h @@ -41,10 +41,6 @@ # define __NR_pwrite __NR_pwrite64 #endif -/* ELF-like local names start with `.L'. */ -#undef L -#define L(name) .L##name - #ifdef __ASSEMBLER__ /* Linux uses a negative return value to indicate syscall errors, diff --git a/sysdeps/x86_64/dl-machine.h b/sysdeps/x86_64/dl-machine.h index b55523649b..21459b9ab5 100644 --- a/sysdeps/x86_64/dl-machine.h +++ b/sysdeps/x86_64/dl-machine.h @@ -378,7 +378,8 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc, #endif #if defined USE_TLS && !defined RTLD_BOOTSTRAP struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type); - Elf64_Addr value = sym == NULL ? 0 : sym_map->l_addr + sym->st_value; + Elf64_Addr value = (sym == NULL ? 0 + : (Elf64_Addr) sym_map->l_addr + sym->st_value); #else Elf64_Addr value = RESOLVE (&sym, version, r_type); diff --git a/sysdeps/x86_64/dl-tls.h b/sysdeps/x86_64/dl-tls.h new file mode 100644 index 0000000000..3e4768dc1f --- /dev/null +++ b/sysdeps/x86_64/dl-tls.h @@ -0,0 +1,29 @@ +/* Thread-local storage handling in the ELF dynamic linker. x86-64 version. + Copyright (C) 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + + +/* Type used for the representation of TLS information in the GOT. */ +typedef struct +{ + unsigned long int ti_module; + unsigned long int ti_offset; +} tls_index; + + +extern void *__tls_get_addr (tls_index *ti); diff --git a/sysdeps/x86_64/elf/configure b/sysdeps/x86_64/elf/configure new file mode 100755 index 0000000000..466ccd1b1b --- /dev/null +++ b/sysdeps/x86_64/elf/configure @@ -0,0 +1,43 @@ + # Local configure fragment for sysdeps/x86_64/elf. + +if test "$usetls" != no; then +# Check for support of thread-local storage handling in assembler and linker. +echo $ac_n "checking for x86-64 TLS support""... $ac_c" 1>&6 +echo "configure:7: checking for x86-64 TLS support" >&5 +if eval "test \"`echo '$''{'libc_cv_x86_64_tls'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.s <<\EOF + .section ".tdata", "awT", @progbits + .globl foo +foo: .quad 1 + .section ".tbss", "awT", @nobits + .globl bar +bar: .skip 8 + .text +baz: leaq bar@TLSLD(%rip), %rdi + leaq bar@DTPOFF(%rax), %rcx + addq foo@GOTTPOFF(%rip), %rax + movq $bar@TPOFF, %rdx +EOF +if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5'; { (eval echo configure:24: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then + libc_cv_x86_64_tls=yes +else + libc_cv_x86_64_tls=no +fi +rm -f conftest* +fi + +echo "$ac_t""$libc_cv_x86_64_tls" 1>&6 +if test $libc_cv_x86_64_tls = yes; then + cat >> confdefs.h <<\EOF +#define HAVE_TLS_SUPPORT 1 +EOF + +fi +fi + +cat >> confdefs.h <<\EOF +#define PI_STATIC_AND_HIDDEN 1 +EOF + diff --git a/sysdeps/x86_64/elf/configure.in b/sysdeps/x86_64/elf/configure.in new file mode 100644 index 0000000000..7679a09b76 --- /dev/null +++ b/sysdeps/x86_64/elf/configure.in @@ -0,0 +1,35 @@ +sinclude(./aclocal.m4)dnl Autoconf lossage +GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory. +# Local configure fragment for sysdeps/x86_64/elf. + +if test "$usetls" != no; then +# Check for support of thread-local storage handling in assembler and linker. +AC_CACHE_CHECK(for x86-64 TLS support, libc_cv_x86_64_tls, [dnl +cat > conftest.s <<\EOF + .section ".tdata", "awT", @progbits + .globl foo +foo: .quad 1 + .section ".tbss", "awT", @nobits + .globl bar +bar: .skip 8 + .text +baz: leaq bar@TLSLD(%rip), %rdi + leaq bar@DTPOFF(%rax), %rcx + addq foo@GOTTPOFF(%rip), %rax + movq $bar@TPOFF, %rdx +EOF +dnl +if AC_TRY_COMMAND(${CC-cc} -c $CFLAGS conftest.s 1>&AC_FD_CC); then + libc_cv_x86_64_tls=yes +else + libc_cv_x86_64_tls=no +fi +rm -f conftest*]) +if test $libc_cv_x86_64_tls = yes; then + AC_DEFINE(HAVE_TLS_SUPPORT) +fi +fi + +dnl It is always possible to access static and hidden symbols in an +dnl position independent way. +AC_DEFINE(PI_STATIC_AND_HIDDEN) diff --git a/sysdeps/x86_64/sysdep.h b/sysdeps/x86_64/sysdep.h index a9c0d25f11..1aa60fea8e 100644 --- a/sysdeps/x86_64/sysdep.h +++ b/sysdeps/x86_64/sysdep.h @@ -94,7 +94,12 @@ lose: \ /* Local label name for asm code. */ #ifndef L -#define L(name) name +# ifdef HAVE_ELF +/* ELF-like local names start with `.L'. */ +# define L(name) .L##name +# else +# define L(name) name +# endif #endif #endif /* __ASSEMBLER__ */ -- cgit v1.2.3