From 59145f8cfba57000c8d920bea89652586a686837 Mon Sep 17 00:00:00 2001 From: Aleksandar Ristovski Date: Mon, 12 Sep 2011 19:00:22 +0000 Subject: [PATCH] * solib.c (solib_used): New function. (update_solib_list, reload_shared_libraries_1): Check if objfile is used by another so_list object before freeing it. --- gdb/ChangeLog | 6 ++++++ gdb/solib.c | 20 ++++++++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 74aef61b4ed..2006913bfd5 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2011-09-01 Aleksandar Ristovski + + * solib.c (used): New function. + (update_solib_list, reload_shared_libraries_1): Check if objfile is used + by another so_list object before freeing it. + 2011-09-11 Jan Kratochvil Code cleanup. diff --git a/gdb/solib.c b/gdb/solib.c index 6c0a8998e2e..402e9bc6b91 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);