Update.
authorUlrich Drepper <drepper@redhat.com>
Sat, 13 Nov 2004 18:58:01 +0000 (18:58 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sat, 13 Nov 2004 18:58:01 +0000 (18:58 +0000)
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.

ChangeLog
elf/rtld.c
malloc/malloc.c

index 21c8666..8defa6a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
index 29aee2d..601fc7d 100644 (file)
@@ -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;
        }
index d2112b1..85a9f45 100644 (file)
@@ -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
   }
 }