Update.
authorUlrich Drepper <drepper@redhat.com>
Wed, 20 Jan 1999 18:32:29 +0000 (18:32 +0000)
committerUlrich Drepper <drepper@redhat.com>
Wed, 20 Jan 1999 18:32:29 +0000 (18:32 +0000)
* elf/dl-close.c: Handle failed loads which would have gone in the
global scope correctly.

* elf/testobj1.c: Include stdlib.h to get NULL defined.
* elf/testobj2.c: Likewise.
* elf/testobj3.c: Likewise.
* elf/testobj4.c: Likewise.
* elf/testobj5.c: Likewise.

* iconvdata/sami-ws2.c: New file.

ChangeLog
elf/dl-close.c
elf/testobj1.c
elf/testobj2.c
elf/testobj3.c
elf/testobj4.c
elf/testobj5.c

index f8f484d..10b1a7b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,9 +1,18 @@
 1999-01-20  Ulrich Drepper  <drepper@cygnus.com>
 
+       * elf/dl-close.c: Handle failed loads which would have gone in the
+       global scope correctly.
+
+       * elf/testobj1.c: Include stdlib.h to get NULL defined.
+       * elf/testobj2.c: Likewise.
+       * elf/testobj3.c: Likewise.
+       * elf/testobj4.c: Likewise.
+       * elf/testobj5.c: Likewise.
+
        * iconvdata/Makefile (modules): Add SAMI-WS2 and ISO-IR-197.
        * iconvdata/gconv-modules: Add entries for above charsets.
        * iconvdata/iso-ir-197.c: New file.
-       * iconvdata/same-ws2.c: New file.
+       * iconvdata/sami-ws2.c: New file.
 
        * sysdeps/unix/sysv/linux/vfork.c: Once again use generic version.
 
index 6a68651..8caa297 100644 (file)
@@ -106,29 +106,35 @@ _dl_close (struct link_map *map)
              unsigned int cnt = _dl_main_searchlist->r_nlist;
 
              do
-               --cnt;
+               if (--cnt < 0)
+                 break;
              while (_dl_main_searchlist->r_list[cnt] != imap);
 
-             while (++cnt < _dl_main_searchlist->r_nlist)
-               _dl_main_searchlist->r_list[cnt - 1]
-                 = _dl_main_searchlist->r_list[cnt];
+             if (cnt >= 0)
+               {
+                 /* 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)
+                 --_dl_main_searchlist->r_nlist;
+               }
+             else
                {
-                 /* 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);
+                 /* This can happen if loading was interrupted by something
+                    like a missing symbol in the newly loaded objects.  In
+                    this case the object is already marked as global but
+                    `r_nlist' does not count it in.  The pointer is in the
+                    `r_list' array so we keep searching in the other
+                    direction.  */
+                 cnt = _dl_main_searchlist->r_nlist;
+                 while (_dl_main_searchlist->r_list[cnt] != imap)
+                   {
+                     ++cnt;
+                     /* Note that if _dl_global_scope_alloc is zero we
+                        should never come here in the first place.  */
+                     assert (cnt < _dl_global_scope_alloc);
+                   }
                }
            }
 
@@ -186,6 +192,22 @@ _dl_close (struct link_map *map)
 
   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 ();
index b88a8d0..354e1a7 100644 (file)
@@ -1,4 +1,5 @@
 #include <dlfcn.h>
+#include <stdlib.h>
 
 int
 obj1func1 (int a __attribute__ ((unused)))
index ba91fe8..dc34ecb 100644 (file)
@@ -1,4 +1,5 @@
 #include <dlfcn.h>
+#include <stdlib.h>
 
 int
 obj2func1 (int a __attribute__ ((unused)))
index f89b904..1fb10f9 100644 (file)
@@ -1,4 +1,5 @@
 #include <dlfcn.h>
+#include <stdlib.h>
 
 int
 obj3func1 (int a __attribute__ ((unused)))
index 38905c8..d780bef 100644 (file)
@@ -1,4 +1,5 @@
 #include <dlfcn.h>
+#include <stdlib.h>
 
 int
 obj4func1 (int a __attribute__ ((unused)))
index 0a2bbe0..e30ca14 100644 (file)
@@ -1,4 +1,5 @@
 #include <dlfcn.h>
+#include <stdlib.h>
 
 int
 obj5func1 (int a __attribute__ ((unused)))