diff options
-rw-r--r-- | ChangeLog | 12 | ||||
-rw-r--r-- | sysdeps/generic/libc-tls.c | 36 |
2 files changed, 24 insertions, 24 deletions
@@ -1,9 +1,19 @@ +2002-08-28 Roland McGrath <roland@redhat.com> + + * sysdeps/generic/libc-tls.c (__libc_setup_tls): Don't check for + PT_LOAD program headers and don't try to relocate PT_TLS's p_vaddr; + it is already absolute. + + * elf/Makefile (tests): List tst-tls1 and tst-tls2 unconditionally. + [$(build-static) = yes] (tests): Add tst-tls1-static, tst-tls2-static. + [$(build-static) = yes] (tests-static): New variable. + ($(tests-static):%=$(objfpx)%.o)): New static pattern rule. + 2002-08-26 Christoph Hellwig <hch@lst.de> * sysdeps/unix/sysv/linux/sys/personality.h: Remark origin, fix formating braindamage, add missing PER_HPUX and PER_OSF1 values. - 2002-08-28 Ulrich Drepper <drepper@redhat.com> * sysdeps/x86_64/Dist: Add _mcount.S and bits/link.h. 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. */ |