fgetws implementation.
[kopensolaris-gnu/glibc.git] / elf / dl-close.c
index 6a68651..a738b11 100644 (file)
@@ -103,33 +103,18 @@ _dl_close (struct link_map *map)
          if (imap->l_global)
            {
              /* This object is in the global scope list.  Remove it.  */
-             unsigned int cnt = _dl_main_searchlist->r_nlist;
+             int cnt = _dl_main_searchlist->r_nlist;
 
              do
                --cnt;
              while (_dl_main_searchlist->r_list[cnt] != imap);
 
+             /* The object was already correctly registered.  */
              while (++cnt < _dl_main_searchlist->r_nlist)
                _dl_main_searchlist->r_list[cnt - 1]
                  = _dl_main_searchlist->r_list[cnt];
 
              --_dl_main_searchlist->r_nlist;
-             if (_dl_main_searchlist->r_nlist
-                 == _dl_initial_searchlist.r_nlist)
-               {
-                 /* All object dynamically loaded by the program are
-                    unloaded.  Free the memory allocated for the global
-                    scope variable.  */
-                 struct link_map **old = _dl_main_searchlist->r_list;
-
-                 /* Put the old map in.  */
-                 _dl_main_searchlist->r_list = _dl_initial_searchlist.r_list;
-                 /* Signal that the old map is used.  */
-                 _dl_global_scope_alloc = 0;
-
-                 /* Now free the old map.  */
-                 free (old);
-               }
            }
 
          /* We can unmap all the maps at once.  We determined the
@@ -180,12 +165,31 @@ _dl_close (struct link_map *map)
          if (imap != map && imap->l_searchlist.r_list != NULL)
            free (imap->l_searchlist.r_list);
 
+         if (imap->l_phdr_allocated)
+           free ((void *) imap->l_phdr);
+
          free (imap);
        }
     }
 
   free (list);
 
+  if (_dl_global_scope_alloc != 0
+      && _dl_main_searchlist->r_nlist == _dl_initial_searchlist.r_nlist)
+    {
+      /* All object dynamically loaded by the program are unloaded.  Free
+        the memory allocated for the global scope variable.  */
+      struct link_map **old = _dl_main_searchlist->r_list;
+
+      /* Put the old map in.  */
+      _dl_main_searchlist->r_list = _dl_initial_searchlist.r_list;
+      /* Signal that the original map is used.  */
+      _dl_global_scope_alloc = 0;
+
+      /* Now free the old map.  */
+      free (old);
+    }
+
   /* Notify the debugger those objects are finalized and gone.  */
   _r_debug.r_state = RT_CONSISTENT;
   _dl_debug_state ();