diff options
Diffstat (limited to 'sysdeps/generic/libc-tls.c')
-rw-r--r-- | sysdeps/generic/libc-tls.c | 36 |
1 files changed, 13 insertions, 23 deletions
diff --git a/sysdeps/generic/libc-tls.c b/sysdeps/generic/libc-tls.c index 71cae95b19..2bbdf2e0a0 100644 --- a/sysdeps/generic/libc-tls.c +++ b/sysdeps/generic/libc-tls.c @@ -59,35 +59,26 @@ __libc_setup_tls (size_t tcbsize, size_t tcbalign) void *tlsblock; size_t memsz = 0; size_t filesz = 0; - size_t initimage = 0; + void *initimage = NULL; size_t align = 0; size_t max_align = tcbalign; - size_t loadaddr = ~0ul; size_t tcb_offset; ElfW(Phdr) *phdr; /* Look through the TLS segment if there is any. */ if (_dl_phdr != NULL) for (phdr = _dl_phdr; phdr < &_dl_phdr[_dl_phnum]; ++phdr) - { - if (phdr->p_type == PT_TLS) - { - /* Remember the values we need. */ - memsz = phdr->p_memsz; - filesz = phdr->p_filesz; - initimage = phdr->p_vaddr; - align = phdr->p_align; - if (phdr->p_align > max_align) - max_align = phdr->p_align; - } - else if (phdr->p_type == PT_LOAD) - { - /* We have to find the load address which is not easy. - Look for the load segment with the lowest address. */ - if (phdr->p_vaddr < loadaddr) - loadaddr = phdr->p_vaddr; - } - } + if (phdr->p_type == PT_TLS) + { + /* Remember the values we need. */ + memsz = phdr->p_memsz; + filesz = phdr->p_filesz; + initimage = (void *) phdr->p_vaddr; + align = phdr->p_align; + if (phdr->p_align > max_align) + max_align = phdr->p_align; + break; + } if (memsz == 0 && tcbsize == 0) /* We do not need a TLS block and no thread descriptor. */ @@ -125,8 +116,7 @@ __libc_setup_tls (size_t tcbsize, size_t tcbalign) # else # error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined" # endif - memset (__mempcpy (static_dtv[2].pointer, (char *) loadaddr + initimage, - filesz), + memset (__mempcpy (static_dtv[2].pointer, initimage, filesz), '\0', memsz - filesz); /* Install the pointer to the dtv. */ |