diff options
author | Ulrich Drepper <drepper@redhat.com> | 2003-01-17 19:57:05 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2003-01-17 19:57:05 +0000 |
commit | 0f0b799489b3b4df2c69c9a6844be6a8f294778d (patch) | |
tree | eb3e992ccc2b6635acfb7828bd8a00f4a69049ac /sysdeps | |
parent | d1852dbb73b0ceb21cd132bb57ac2cee2364d786 (diff) | |
download | glibc-0f0b799489b3b4df2c69c9a6844be6a8f294778d.tar glibc-0f0b799489b3b4df2c69c9a6844be6a8f294778d.tar.gz glibc-0f0b799489b3b4df2c69c9a6844be6a8f294778d.tar.bz2 glibc-0f0b799489b3b4df2c69c9a6844be6a8f294778d.zip |
Update.
2003-01-17 Richard Henderson <rth@redhat.com>
* sysdeps/alpha/dl-machine.h (elf_machine_type_class): Add TLS
relocs for class PLT.
* sysdeps/alpha/libc-tls.c: New file.
* sysdeps/unix/alpha/sysdep.S (EPILOGUE, GPSAVEREG): New.
(LOADGP) [!PIC]: Rewrite to preserve caller's gp.
2003-01-17 Jakub Jelinek <jakub@redhat.com>
* sysdeps/unix/sysv/linux/ia64/dl-static.c (_dl_static_init): Use
__libc_lock_{,un}lock_recursive instead of __libc_lock_{,un}lock
on _dl_static_lock.
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/alpha/dl-machine.h | 21 | ||||
-rw-r--r-- | sysdeps/alpha/libc-tls.c | 37 | ||||
-rw-r--r-- | sysdeps/unix/alpha/sysdep.S | 42 |
3 files changed, 89 insertions, 11 deletions
diff --git a/sysdeps/alpha/dl-machine.h b/sysdeps/alpha/dl-machine.h index 5016f1353e..25359d883e 100644 --- a/sysdeps/alpha/dl-machine.h +++ b/sysdeps/alpha/dl-machine.h @@ -387,13 +387,24 @@ $fixup_stack: \n\ #define RTLD_START_SPECIAL_INIT /* nothing */ #endif -/* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry, so - PLT entries should not be allowed to define the value. - ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one - of the main executable's symbols, as for a COPY reloc, which we don't - use. */ +/* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry + or TLS variables, so undefined references should not be allowed + to define the value. + + ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve + to one of the main executable's symbols, as for a COPY reloc. + This is unused on Alpha. */ + +#if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD) +#define elf_machine_type_class(type) \ + (((type) == R_ALPHA_JMP_SLOT \ + || (type) == R_ALPHA_DTPMOD64 \ + || (type) == R_ALPHA_DTPREL64 \ + || (type) == R_ALPHA_TPREL64) * ELF_RTYPE_CLASS_PLT) +#else #define elf_machine_type_class(type) \ (((type) == R_ALPHA_JMP_SLOT) * ELF_RTYPE_CLASS_PLT) +#endif /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */ #define ELF_MACHINE_JMP_SLOT R_ALPHA_JMP_SLOT diff --git a/sysdeps/alpha/libc-tls.c b/sysdeps/alpha/libc-tls.c new file mode 100644 index 0000000000..434d5d9313 --- /dev/null +++ b/sysdeps/alpha/libc-tls.c @@ -0,0 +1,37 @@ +/* Thread-local storage handling in the ELF dynamic linker. Alpha version. + Copyright (C) 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <sysdeps/generic/libc-tls.c> +#include <dl-tls.h> + +#if USE_TLS + +/* On Alpha, linker optimizations are not required, so __tls_get_addr + can be called even in statically linked binaries. In this case module + must be always 1 and PT_TLS segment exist in the binary, otherwise it + would not link. */ + +void * +__tls_get_addr (tls_index *ti) +{ + dtv_t *dtv = THREAD_DTV (); + return (char *) dtv[1].pointer + ti->ti_offset; +} + +#endif diff --git a/sysdeps/unix/alpha/sysdep.S b/sysdeps/unix/alpha/sysdep.S index c31508bc30..ce848f4e9b 100644 --- a/sysdeps/unix/alpha/sysdep.S +++ b/sysdeps/unix/alpha/sysdep.S @@ -1,4 +1,4 @@ -/* Copyright (C) 1993, 1996, 1998, 2002 Free Software Foundation, Inc. +/* Copyright (C) 1993, 1996, 1998, 2002, 2003 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Brendan Kehoe (brendan@zen.org). @@ -35,9 +35,26 @@ have we loaded PV with our address. Do both. */ # define LOADGP br pv, 1f; 1: ldgp gp, 0(pv) # define PROLOGUE .prologue 0 +# define EPILOGUE #else -# define LOADGP ldgp gp, 0(pv) + /* When building the static library, we tail call here from + elsewhere, which might use a different GP. The entertaining + part is that we have to return with the GP of our caller + in place, so that linker relaxation works properly. */ + /* ??? This is so ugly. Consider always putting the errno + setting code with the syscall in the static case. */ +# define GPSAVEREG t10 +# define LOADGP ldah t11, 0(pv) !gpdisp!1; \ + br 1f; \ + .subsection 2; \ + 1: mov gp, GPSAVEREG; \ + lda gp, 0(t11) !gpdisp!1; \ + br 2f; \ + .previous; \ + mov gp, GPSAVEREG; \ + 2: # define PROLOGUE .prologue 1 +# define EPILOGUE mov GPSAVEREG, gp #endif .align 4 @@ -61,16 +78,20 @@ __syscall_error: addq v0, t1, v0 stl t0, 0(v0) lda v0, -1 + EPILOGUE ret #elif defined(_LIBC_REENTRANT) LOADGP - lda sp, -16(sp) - .frame sp, 16, ra, 0 + lda sp, -32(sp) + .frame sp, 32, ra, 0 stq ra, 0(sp) stq v0, 8(sp) - .mask 0x4000001, -16 +#ifdef GPSAVEREG + stq GPSAVEREG, 16(sp) +#endif + .mask 0x4000001, -32 PROLOGUE /* Find our per-thread errno address */ @@ -78,6 +99,9 @@ __syscall_error: bsr ra, __errno_location !samegp #else jsr ra, __errno_location +#ifndef GPSAVEREG + ldgp gp, 0(ra) +#endif #endif /* Store the error value. */ @@ -87,8 +111,12 @@ __syscall_error: /* And kick back a -1. */ ldi v0, -1 +#ifdef GPSAVEREG + ldq GPSAVEREG, 16(sp) +#endif ldq ra, 0(sp) - lda sp, 16(sp) + lda sp, 32(sp) + EPILOGUE ret #else @@ -97,8 +125,10 @@ __syscall_error: PROLOGUE stl v0, errno lda v0, -1 + EPILOGUE ret #endif + .subsection 3 .end __syscall_error |