* solib.c (reload_shared_libraries): Give
authorVladimir Prus <vladimir@codesourcery.com>
Mon, 9 Mar 2009 13:19:19 +0000 (13:19 +0000)
committerVladimir Prus <vladimir@codesourcery.com>
Mon, 9 Mar 2009 13:19:19 +0000 (13:19 +0000)
       inferior a chance to reset solib breakpoint.
       Reinit frame cache.

gdb/ChangeLog
gdb/solib.c

index d99265fbbd80d3463dedd2651c246bd23ecea905..10b3429e2d2d12aa595babdd930d8232555734ff 100644 (file)
@@ -1,3 +1,9 @@
+2008-03-09  Vladimir Prus  <vladimir@codesourcery.com>
+
+       * solib.c (reload_shared_libraries): Give
+       inferior a chance to reset solib breakpoint.
+       Reinit frame cache.
+
 2009-03-08  Christopher Faylor  <me+cygwin@cgf.cx>
 
        * windows-nat.c (dr): Redefine to use largest possible integer which
index f2e68f5a7b749e0f0266e0d33328828d7f169a6b..0bd767ef659eb5a1ec76cff3ccfc46bdec78513c 100644 (file)
@@ -1015,6 +1015,28 @@ reload_shared_libraries (char *ignored, int from_tty,
 {
   no_shared_libraries (NULL, from_tty);
   solib_add (NULL, from_tty, NULL, auto_solib_add);
+  /* Creating inferior hooks here has two purposes. First, if we reload 
+     shared libraries then the address of solib breakpoint we've computed
+     previously might be no longer valid.  For example, if we forgot to set
+     solib-absolute-prefix and are setting it right now, then the previous
+     breakpoint address is plain wrong.  Second, installing solib hooks
+     also implicitly figures were ld.so is and loads symbols for it.
+     Absent this call, if we've just connected to a target and set 
+     solib-absolute-prefix or solib-search-path, we'll lose all information
+     about ld.so.  */
+  if (target_has_execution)
+    {
+#ifdef SOLIB_CREATE_INFERIOR_HOOK
+      SOLIB_CREATE_INFERIOR_HOOK (PIDGET (inferior_ptid));
+#else
+      solib_create_inferior_hook ();
+#endif
+    }
+  /* We have unloaded and then reloaded debug info for all shared libraries.
+     However, frames may still reference them, for example a frame's 
+     unwinder might still point of DWARF FDE structures that are now freed.
+     Reinit frame cache to avoid crashing.  */
+  reinit_frame_cache ();
 }
 
 static void