Add hidden __tls_get_addr/___tls_get_addr alias

__tls_get_addr/___tls_get_addr is always defined in ld.so.  There is
no need to call them via PLT inside ld.so.  This patch adds the hidden
__tls_get_addr/___tls_get_addr aliases and calls them directly from
_dl_tlsdesc_dynamic.  There is no need to set up the EBX register in
i386 _dl_tlsdesc_dynamic when calling the hidden ___tls_get_addr.

	* elf/dl-tls.c (__tls_get_addr): Provide the hidden definition
	if not defined.
	* sysdeps/i386/dl-tls.h (___tls_get_addr): Provide the hidden
	definition.
	* sysdeps/i386/dl-tlsdesc.S (_dl_tlsdesc_dynamic): Call the
	hidden ___tls_get_addr.
	* sysdeps/x86_64/dl-tlsdesc.S (_dl_tlsdesc_dynamic): Call the
	hidden __tls_get_addr.
	* sysdeps/generic/localplt.data (__tls_get_addr): Removed.
	* sysdeps/unix/sysv/linux/i386/localplt.data (___tls_get_addr):
	Likewise.
This commit is contained in:
H.J. Lu 2014-12-21 09:12:04 -08:00
parent 6df5547e93
commit 050f7298e1
7 changed files with 34 additions and 15 deletions

View File

@ -1,3 +1,17 @@
2014-12-21 H.J. Lu <hongjiu.lu@intel.com>
* elf/dl-tls.c (__tls_get_addr): Provide the hidden definition
if not defined.
* sysdeps/i386/dl-tls.h (___tls_get_addr): Provide the hidden
definition.
* sysdeps/i386/dl-tlsdesc.S (_dl_tlsdesc_dynamic): Call the
hidden ___tls_get_addr.
* sysdeps/x86_64/dl-tlsdesc.S (_dl_tlsdesc_dynamic): Call the
hidden __tls_get_addr.
* sysdeps/generic/localplt.data (__tls_get_addr): Removed.
* sysdeps/unix/sysv/linux/i386/localplt.data (___tls_get_addr):
Likewise.
2014-12-21 Andreas Schwab <schwab@linux-m68k.org> 2014-12-21 Andreas Schwab <schwab@linux-m68k.org>
* sysdeps/m68k/dl-machine.h (RTLD_START): Remove @PLTPC from * sysdeps/m68k/dl-machine.h (RTLD_START): Remove @PLTPC from

View File

@ -809,6 +809,16 @@ update_get_addr (GET_ADDR_ARGS)
return (void *) p + GET_ADDR_OFFSET; return (void *) p + GET_ADDR_OFFSET;
} }
/* For all machines that have a non-macro version of __tls_get_addr, we
want to use rtld_hidden_proto/rtld_hidden_def in order to call the
internal alias for __tls_get_addr from ld.so. This avoids a PLT entry
in ld.so for __tls_get_addr. */
#ifndef __tls_get_addr
extern void * __tls_get_addr (GET_ADDR_ARGS);
rtld_hidden_proto (__tls_get_addr)
rtld_hidden_def (__tls_get_addr)
#endif
/* The generic dynamic and local dynamic model cannot be used in /* The generic dynamic and local dynamic model cannot be used in
statically linked applications. */ statically linked applications. */

View File

@ -7,10 +7,9 @@ libc.so: malloc
libc.so: memalign libc.so: memalign
libc.so: realloc libc.so: realloc
libm.so: matherr libm.so: matherr
# The dynamic loader needs __tls_get_addr for TLS, and uses __libc_memalign # The dynamic loader uses __libc_memalign internally to allocate aligned
# internally to allocate aligned TLS storage. The other malloc family of # TLS storage. The other malloc family of functions are expected to allow
# functions are expected to allow user symbol interposition. # user symbol interposition.
ld.so: __tls_get_addr
ld.so: __libc_memalign ld.so: __libc_memalign
ld.so: malloc ld.so: malloc
ld.so: calloc ld.so: calloc

View File

@ -50,6 +50,8 @@ __tls_get_addr (tls_index *ti)
version of this file. */ version of this file. */
# define __tls_get_addr __attribute__ ((__regparm__ (1))) ___tls_get_addr # define __tls_get_addr __attribute__ ((__regparm__ (1))) ___tls_get_addr
strong_alias (___tls_get_addr, ___tls_get_addr_internal) strong_alias (___tls_get_addr, ___tls_get_addr_internal)
rtld_hidden_proto (___tls_get_addr)
rtld_hidden_def (___tls_get_addr)
#else #else
/* Users should get the better interface. */ /* Users should get the better interface. */

View File

@ -126,10 +126,7 @@ _dl_tlsdesc_dynamic:
.p2align 4,,7 .p2align 4,,7
.Lslow: .Lslow:
cfi_adjust_cfa_offset (28) cfi_adjust_cfa_offset (28)
movl %ebx, 16(%esp) call HIDDEN_JUMPTARGET (___tls_get_addr)
LOAD_PIC_REG (bx)
call ___tls_get_addr@PLT
movl 16(%esp), %ebx
jmp .Lret jmp .Lret
cfi_endproc cfi_endproc
.size _dl_tlsdesc_dynamic, .-_dl_tlsdesc_dynamic .size _dl_tlsdesc_dynamic, .-_dl_tlsdesc_dynamic

View File

@ -5,12 +5,9 @@ libc.so: malloc
libc.so: memalign libc.so: memalign
libc.so: realloc libc.so: realloc
libm.so: matherr libm.so: matherr
# The dynamic loader needs ___tls_get_addr for TLS, and uses __libc_memalign # The dynamic loader uses __libc_memalign internally to allocate aligned
# internally to allocate aligned TLS storage. The other malloc family of # TLS storage. The other malloc family of functions are expected to allow
# functions are expected to allow user symbol interposition. # user symbol interposition.
# Note that it is triple underscore for ___tls_get_addr e.g. the alternate
# ABI.
ld.so: ___tls_get_addr
ld.so: __libc_memalign ld.so: __libc_memalign
ld.so: malloc ld.so: malloc
ld.so: calloc ld.so: calloc

View File

@ -128,7 +128,7 @@ _dl_tlsdesc_dynamic:
movq %r10, 40(%rsp) movq %r10, 40(%rsp)
movq %r11, 48(%rsp) movq %r11, 48(%rsp)
/* %rdi already points to the tlsinfo data structure. */ /* %rdi already points to the tlsinfo data structure. */
call __tls_get_addr@PLT call HIDDEN_JUMPTARGET (__tls_get_addr)
movq 8(%rsp), %rdx movq 8(%rsp), %rdx
movq 16(%rsp), %rcx movq 16(%rsp), %rcx
movq 24(%rsp), %r8 movq 24(%rsp), %r8