From: Vladimir Prus Date: Mon, 9 Mar 2009 13:19:19 +0000 (+0000) Subject: * solib.c (reload_shared_libraries): Give X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=c8fa6cdda407a09ab5bd2999a8fe6468b2690fb0;p=binutils-gdb.git * solib.c (reload_shared_libraries): Give inferior a chance to reset solib breakpoint. Reinit frame cache. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d99265fbbd8..10b3429e2d2 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2008-03-09 Vladimir Prus + + * solib.c (reload_shared_libraries): Give + inferior a chance to reset solib breakpoint. + Reinit frame cache. + 2009-03-08 Christopher Faylor * windows-nat.c (dr): Redefine to use largest possible integer which diff --git a/gdb/solib.c b/gdb/solib.c index f2e68f5a7b7..0bd767ef659 100644 --- a/gdb/solib.c +++ b/gdb/solib.c @@ -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