mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-22 10:50:07 +00:00
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:
parent
6df5547e93
commit
050f7298e1
14
ChangeLog
14
ChangeLog
@ -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
|
||||||
|
10
elf/dl-tls.c
10
elf/dl-tls.c
@ -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. */
|
||||||
|
@ -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
|
||||||
|
@ -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. */
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user