2011-07-26 Paul Pluzhnikov <ppluzhnikov@google.com>
authorPaul Pluzhnikov <ppluzhnikov@google.com>
Tue, 26 Jul 2011 15:17:47 +0000 (15:17 +0000)
committerPaul Pluzhnikov <ppluzhnikov@google.com>
Tue, 26 Jul 2011 15:17:47 +0000 (15:17 +0000)
* progspace.h (struct program_space): Add solib_add_generation.
* infcmd.c (post_create_inferior): Only call solib_add if not
already done.
* solib.c (solib_add): Increment solib_add_generation.

gdb/ChangeLog
gdb/infcmd.c
gdb/progspace.h
gdb/solib.c

index 08361be7536d48adeb8bb69cd96a23c787534531..41dc0b2ea6acce1a752abed9efe9ff482acceeeb 100644 (file)
@@ -1,3 +1,10 @@
+2011-07-26  Paul Pluzhnikov  <ppluzhnikov@google.com>
+
+       * progspace.h (struct program_space): Add solib_add_generation.
+       * infcmd.c (post_create_inferior): Only call solib_add if not
+       already done.
+       * solib.c (solib_add): Increment solib_add_generation.
+
 2011-07-25  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        Fix implicit pointer offsets.
index aa3646b483c938b8d8bccb0722ef4b8141f04686..0a38c64c7e8ed06ed58c4f70e1d59b2cafeb11bc 100644 (file)
@@ -421,6 +421,9 @@ post_create_inferior (struct target_ops *target, int from_tty)
 
   if (exec_bfd)
     {
+      const unsigned solib_add_generation
+       = current_program_space->solib_add_generation;
+
       /* Create the hooks to handle shared library load and unload
         events.  */
 #ifdef SOLIB_CREATE_INFERIOR_HOOK
@@ -428,24 +431,29 @@ post_create_inferior (struct target_ops *target, int from_tty)
 #else
       solib_create_inferior_hook (from_tty);
 #endif
-    }
-
-  /* If the solist is global across processes, there's no need to
-     refetch it here.  */
-  if (exec_bfd && !gdbarch_has_global_solist (target_gdbarch))
-    {
-      /* Sometimes the platform-specific hook loads initial shared
-        libraries, and sometimes it doesn't.  If it doesn't FROM_TTY will be
-        incorrectly 0 but such solib targets should be fixed anyway.  If we
-        made all the inferior hook methods consistent, this call could be
-        removed.  Call it only after the solib target has been initialized by
-        solib_create_inferior_hook.  */
 
+      if (current_program_space->solib_add_generation == solib_add_generation)
+       {
+         /* The platform-specific hook should load initial shared libraries,
+            but didn't.  FROM_TTY will be incorrectly 0 but such solib
+            targets should be fixed anyway.  Call it only after the solib
+            target has been initialized by solib_create_inferior_hook.  */
+
+         if (info_verbose)
+           warning (_("platform-specific solib_create_inferior_hook did "
+                      "not load initial shared libraries."));
+
+         /* If the solist is global across processes, there's no need to
+            refetch it here.  */
+         if (!gdbarch_has_global_solist (target_gdbarch))
+           {
 #ifdef SOLIB_ADD
-      SOLIB_ADD (NULL, 0, target, auto_solib_add);
+             SOLIB_ADD (NULL, 0, target, auto_solib_add);
 #else
-      solib_add (NULL, 0, target, auto_solib_add);
+             solib_add (NULL, 0, target, auto_solib_add);
 #endif
+           }
+       }
     }
 
   /* If the user sets watchpoints before execution having started,
index 5d3ed950f75d85ddace03dbc069831c9bbdefb6e..76e8080a8522417d750b294f5020c80421657aef 100644 (file)
@@ -185,6 +185,9 @@ struct program_space
        solib.c.  */
     struct so_list *so_list;
 
+    /* Number of calls to solib_add.  */
+    unsigned solib_add_generation;
+
     /* Per pspace data-pointers required by other GDB modules.  */
     void **data;
     unsigned num_data;
index 94f8f13422e22b14f30c9677879cddf45ff0b584..49c1cdbfd645fe95b28473dfcad1dfe827c7778c 100644 (file)
@@ -914,6 +914,8 @@ solib_add (char *pattern, int from_tty,
 {
   struct so_list *gdb;
 
+  current_program_space->solib_add_generation++;
+
   if (pattern)
     {
       char *re_err = re_comp (pattern);