diff options
Diffstat (limited to 'gdb/solib.c')
-rw-r--r-- | gdb/solib.c | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/gdb/solib.c b/gdb/solib.c index 6c0a899..402e9bc 100644 --- a/gdb/solib.c +++ b/gdb/solib.c @@ -633,6 +633,20 @@ solib_read_symbols (struct so_list *so, int flags) return 0; } +/* Return 1 if KNOWN->objfile is used by any other so_list object in the + SO_LIST_HEAD list. Return 0 otherwise. */ + +static int +solib_used (const struct so_list *const known) +{ + const struct so_list *pivot; + + for (pivot = so_list_head; pivot != NULL; pivot = pivot->next) + if (pivot != known && pivot->objfile == known->objfile) + return 1; + return 0; +} + /* Synchronize GDB's shared object list with inferior's. Extract the list of currently loaded shared objects from the @@ -749,7 +763,8 @@ update_solib_list (int from_tty, struct target_ops *target) *gdb_link = gdb->next; /* Unless the user loaded it explicitly, free SO's objfile. */ - if (gdb->objfile && ! (gdb->objfile->flags & OBJF_USERLOADED)) + if (gdb->objfile && ! (gdb->objfile->flags & OBJF_USERLOADED) + && !solib_used (gdb)) free_objfile (gdb->objfile); /* Some targets' section tables might be referring to @@ -1225,7 +1240,8 @@ reload_shared_libraries_1 (int from_tty) || (found_pathname != NULL && filename_cmp (found_pathname, so->so_name) != 0)) { - if (so->objfile && ! (so->objfile->flags & OBJF_USERLOADED)) + if (so->objfile && ! (so->objfile->flags & OBJF_USERLOADED) + && !solib_used (so)) free_objfile (so->objfile); remove_target_sections (so->abfd); free_so_symbols (so); |