about summary refs log tree commit diff
path: root/elf/dl-open.c
diff options
context:
space:
mode:
Diffstat (limited to 'elf/dl-open.c')
-rw-r--r--elf/dl-open.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/elf/dl-open.c b/elf/dl-open.c
index 9389303b90..373d32dd79 100644
--- a/elf/dl-open.c
+++ b/elf/dl-open.c
@@ -29,6 +29,7 @@ _dl_open (struct link_map *parent, const char *file, int mode)
 {
   struct link_map *new, *l;
   ElfW(Addr) init;
+  struct r_debug *r;
 
 
   /* Load the named object.  */
@@ -47,7 +48,7 @@ _dl_open (struct link_map *parent, const char *file, int mode)
   l = new;
   while (l->l_next)
     l = l->l_next;
-  do
+  while (1)
     {
       if (! l->l_relocated)
 	{
@@ -56,8 +57,10 @@ _dl_open (struct link_map *parent, const char *file, int mode)
 	  *_dl_global_scope_end = NULL;
 	}
 
+      if (l == new)
+	break;
       l = l->l_prev;
-    } while (l != new);
+    }
 
   new->l_global = (mode & RTLD_GLOBAL);
   if (new->l_global)
@@ -108,6 +111,14 @@ _dl_open (struct link_map *parent, const char *file, int mode)
 	}
     }
 
+
+  /* Notify the debugger we have added some objects.  We need to call
+     _dl_debug_initialize in a static program in case dynamic linking has
+     not been used before.  */
+  r = _dl_debug_initialize (0);
+  r->r_state = RT_ADD;
+  _dl_debug_state ();
+
   /* Run the initializer functions of new objects.  */
   while (init = _dl_init_next (new))
     (*(void (*) (void)) init) ();