diff options
-rw-r--r-- | ChangeLog | 11 | ||||
-rw-r--r-- | elf/rtld.c | 20 | ||||
-rw-r--r-- | malloc/malloc.c | 8 |
3 files changed, 27 insertions, 12 deletions
@@ -1,3 +1,14 @@ +2004-11-13 Jakub Jelinek <jakub@redhat.com> + + * elf/rtld.c (print_statistics): Avoid segfaults if not all namespaces + are used. Fix computation of num_relative_relocations on RELA + architectures other than IA-64 and Alpha. + +2004-11-13 Ulrich Drepper <drepper@redhat.com> + + * malloc/malloc.c (_int_free): Use munmap_chunk for handling + mmaped memory. + 2004-11-12 Ulrich Drepper <drepper@redhat.com> * malloc/malloc.c (_int_free): Remove test for NULL parameter. @@ -2336,19 +2336,29 @@ print_statistics (hp_timing_t *rtld_total_timep) unsigned long int num_relative_relocations = 0; for (Lmid_t ns = 0; ns < DL_NNS; ++ns) { + if (GL(dl_ns)[ns]._ns_loaded == NULL) + continue; + struct r_scope_elem *scope = &GL(dl_ns)[ns]._ns_loaded->l_searchlist; for (unsigned int i = 0; i < scope->r_nlist; i++) { struct link_map *l = scope->r_list [i]; - if (!l->l_addr) - continue; - - if (l->l_info[VERSYMIDX (DT_RELCOUNT)]) + if (l->l_addr != 0 && l->l_info[VERSYMIDX (DT_RELCOUNT)]) num_relative_relocations += l->l_info[VERSYMIDX (DT_RELCOUNT)]->d_un.d_val; - if (l->l_info[VERSYMIDX (DT_RELACOUNT)]) +#ifndef ELF_MACHINE_REL_RELATIVE + /* Relative relocations are processed on these architectures if + library is loaded to different address than p_vaddr or + if not prelinked. */ + if ((l->l_addr != 0 || !l->l_info[VALIDX(DT_GNU_PRELINKED)]) + && l->l_info[VERSYMIDX (DT_RELACOUNT)]) +#else + /* On e.g. IA-64 or Alpha, relative relocations are processed + only if library is loaded to different address than p_vaddr. */ + if (l->l_addr != 0 && l->l_info[VERSYMIDX (DT_RELACOUNT)]) +#endif num_relative_relocations += l->l_info[VERSYMIDX (DT_RELACOUNT)]->d_un.d_val; } diff --git a/malloc/malloc.c b/malloc/malloc.c index d2112b1..85a9f45 100644 --- a/malloc/malloc.c +++ b/malloc/malloc.c @@ -4370,13 +4370,7 @@ _int_free(mstate av, Void_t* mem) else { #if HAVE_MMAP - int ret; - INTERNAL_SIZE_T offset = p->prev_size; - mp_.n_mmaps--; - mp_.mmapped_mem -= (size + offset); - ret = munmap((char*)p - offset, size + offset); - /* munmap returns non-zero on failure */ - assert(ret == 0); + munmap_chunk (p); #endif } } |