diff options
author | Roland McGrath <roland@gnu.org> | 2002-09-29 10:38:40 +0000 |
---|---|---|
committer | Roland McGrath <roland@gnu.org> | 2002-09-29 10:38:40 +0000 |
commit | 5bbfc1ea7069630149c5fc1b3cec4a044d43a9cd (patch) | |
tree | e7839a54415204305359b7835c6be050c283a197 /sysdeps/x86_64 | |
parent | 3c25964fb000ed7f6bd4ec30d02b3819c581b4b3 (diff) | |
download | glibc-5bbfc1ea7069630149c5fc1b3cec4a044d43a9cd.tar glibc-5bbfc1ea7069630149c5fc1b3cec4a044d43a9cd.tar.gz glibc-5bbfc1ea7069630149c5fc1b3cec4a044d43a9cd.tar.bz2 glibc-5bbfc1ea7069630149c5fc1b3cec4a044d43a9cd.zip |
* 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.
Diffstat (limited to 'sysdeps/x86_64')
-rw-r--r-- | sysdeps/x86_64/dl-machine.h | 3 | ||||
-rw-r--r-- | sysdeps/x86_64/dl-tls.h | 29 | ||||
-rwxr-xr-x | sysdeps/x86_64/elf/configure | 43 | ||||
-rw-r--r-- | sysdeps/x86_64/elf/configure.in | 35 | ||||
-rw-r--r-- | sysdeps/x86_64/sysdep.h | 7 |
5 files changed, 115 insertions, 2 deletions
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__ */ |