diff options
author | Roland McGrath <roland@gnu.org> | 2002-08-05 01:21:25 +0000 |
---|---|---|
committer | Roland McGrath <roland@gnu.org> | 2002-08-05 01:21:25 +0000 |
commit | a816b435dd0b8dde7dc2f8d995bd290998801317 (patch) | |
tree | 07a52658122b19c7a08eacba7eaeb01cdc39b741 /sysdeps | |
parent | 581dc54b74e8131acbb06f7ebb8887815f1914c8 (diff) | |
download | glibc-a816b435dd0b8dde7dc2f8d995bd290998801317.tar.gz glibc-a816b435dd0b8dde7dc2f8d995bd290998801317.tar.xz glibc-a816b435dd0b8dde7dc2f8d995bd290998801317.zip |
* Makerules (cpp-srcs-left): When setting this to run
cppflags-iterator.mk, must append .c to $(tests) and $(xtests) words. Combine the two loops into one on the concatenated list, including those as well as $(test-srcs). * elf/dl-minimal.c (__libc_memalign): Guts of malloc moved here, since we align here with optimally minimal waste anyway. (malloc): Just call that. * sysdeps/generic/libc-tls.c (__libc_setup_tls): Set l_tls_offset to the right variable. * elf/dl-load.c (_dl_map_object_from_fd): Use p_vaddr, not p_offset, to compute memory location for l_tls_initimage. * elf/rtld.c (_dl_start): Likewise. * sysdeps/generic/libc-tls.c (__libc_setup_tls): Likewise. * libio/oldiopopen.c: Move #include's before #if SHLIB_COMPAT, because the .d file is generated in the non-shared case and so fails to catch them otherwise. * sysdeps/generic/dl-tls.c (_dl_allocate_tls_storage): New function, split out of _dl_allocate_tls. (_dl_allocate_tls_init): Likewise. (_dl_allocate_tls): Call those. * sysdeps/generic/ldsodefs.h: Declare them with attribute_hidden. * elf/rtld.c (dl_main): Call them separately instead of calling _dl_allocate_tls. Delay _dl_allocate_tls_init until after relocation is finished, so that the initializer data has been relocated before we copy it into the main thread's TLS block. * sysdeps/generic/dl-tls.c (_dl_allocate_tls): Fix off-by-one error in loop conditions, prevented the last used module from being initialized.
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/generic/ldsodefs.h | 8 | ||||
-rw-r--r-- | sysdeps/generic/libc-tls.c | 10 |
2 files changed, 12 insertions, 6 deletions
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h index 5f586f2e3c..2269950045 100644 --- a/sysdeps/generic/ldsodefs.h +++ b/sysdeps/generic/ldsodefs.h @@ -726,7 +726,13 @@ extern void _dl_determine_tlsoffset (void) internal_function; /* Allocate memory for static TLS block and dtv. */ extern void *_dl_allocate_tls (void) internal_function; -extern void *_dl_allocate_tls_internal (void) internal_function; + +/* These are internal entry points to the two halves of _dl_allocate_tls, + only used within rtld.c itself at startup time. */ +extern void *_dl_allocate_tls_storage (void) + internal_function attribute_hidden; +extern void *_dl_allocate_tls_init (void *) + internal_function attribute_hidden; /* Deallocate memory allocated with _dl_allocate_tls. */ extern void _dl_deallocate_tls (void *tcb) internal_function; diff --git a/sysdeps/generic/libc-tls.c b/sysdeps/generic/libc-tls.c index 8c82040b19..6b9a746dd8 100644 --- a/sysdeps/generic/libc-tls.c +++ b/sysdeps/generic/libc-tls.c @@ -52,7 +52,7 @@ __libc_setup_tls (size_t tcbsize, size_t tcbalign) void *tlsblock; size_t memsz = 0; size_t filesz = 0; - off_t offset = 0; + size_t initimage = 0; size_t align = 0; size_t max_align = tcbalign; size_t loadaddr = ~0ul; @@ -70,7 +70,7 @@ __libc_setup_tls (size_t tcbsize, size_t tcbalign) /* Remember the values we need. */ memsz = phdr->p_memsz; filesz = phdr->p_filesz; - offset = phdr->p_offset; + initimage = phdr->p_vaddr; align = phdr->p_align; if (phdr->p_align > max_align) max_align = phdr->p_align; @@ -120,7 +120,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 + offset, + memset (__mempcpy (static_dtv[2].pointer, (char *) loadaddr + initimage, filesz), '\0', memsz - filesz); @@ -141,12 +141,12 @@ __libc_setup_tls (size_t tcbsize, size_t tcbalign) # endif /* We have to create a fake link map which normally would be created - by the dynamic linker. It just has to have enough informatino to + by the dynamic linker. It just has to have enough information to make the TLS routines happy. */ static_map.l_tls_align = align; static_map.l_tls_blocksize = memsz; static_map.l_tls_initimage_size = filesz; - static_map.l_tls_offset = offset; + static_map.l_tls_offset = tcb_offset; static_map.l_type = lt_executable; static_map.l_tls_modid = 1; |