diff --git a/libexec/rtld-elf/rtld.h b/libexec/rtld-elf/rtld.h --- a/libexec/rtld-elf/rtld.h +++ b/libexec/rtld-elf/rtld.h @@ -418,7 +418,7 @@ void *tls_get_addr_common(struct tcb *tcb, int index, size_t offset); void *allocate_tls(Obj_Entry *, void *, size_t, size_t); void free_tls(void *, size_t, size_t); -void *allocate_module_tls(int index); +void *allocate_module_tls(struct tcb *tcb, int index); bool allocate_tls_offset(Obj_Entry *obj); void free_tls_offset(Obj_Entry *obj); const Ver_Entry *fetch_ventry(const Obj_Entry *obj, unsigned long); diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c --- a/libexec/rtld-elf/rtld.c +++ b/libexec/rtld-elf/rtld.c @@ -5380,7 +5380,7 @@ wlock_acquire(rtld_bind_lock, &lockstate); if (!dtv->dtv_slots[index - 1].dtvs_tls) dtv->dtv_slots[index - 1].dtvs_tls = - allocate_module_tls(index); + allocate_module_tls(tcb, index); if (!locked) lock_release(rtld_bind_lock, &lockstate); } @@ -5665,7 +5665,7 @@ * Allocate TLS block for module with given index. */ void * -allocate_module_tls(int index) +allocate_module_tls(struct tcb *tcb, int index) { Obj_Entry *obj; char *p; @@ -5683,9 +5683,9 @@ if (obj->tls_static) { #ifdef TLS_VARIANT_I - p = (char *)_tcb_get() + obj->tlsoffset; + p = (char *)tcb + obj->tlsoffset; #else - p = (char *)_tcb_get() - obj->tlsoffset; + p = (char *)tcb - obj->tlsoffset; #endif return (p); }