From: Markus Metzger Date: Mon, 2 Jun 2014 09:35:22 +0000 (+0200) Subject: symfile, vdso: remove target sections X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=c33b2f12584e8ae5be0e7a54927194d6b5851623;p=binutils-gdb.git symfile, vdso: remove target sections Target sections added by the add-symbol-file-from-memory command are not removed when the process exits. In fact, they are not removed, at all. This causes GDB to crash in gdb.base/break-interp.exp. Change the owner of those target sections to the object file generated in symbol_file_add_from_memory and generalize the free_objfile observer in symfile.c to remove target sections of any freed object file. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 17f251b250f..458e218be82 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2014-06-06 Markus Metzger + + * symfile.c (symfile_free_objfile): Remove restriction to + OBJF_USERLOADED. + * symfile-mem.c (symbol_file_add_from_memory): Call + add_target_sections_of_objfile. + 2014-06-05 Ludovic Courtès * guile/scm-value.c (gdbscm_history_append_x): Use diff --git a/gdb/symfile-mem.c b/gdb/symfile-mem.c index b29421e3561..ef48f7d1182 100644 --- a/gdb/symfile-mem.c +++ b/gdb/symfile-mem.c @@ -92,7 +92,6 @@ symbol_file_add_from_memory (struct bfd *templ, CORE_ADDR addr, struct section_addr_info *sai; unsigned int i; struct cleanup *cleanup; - struct target_section *sections, *sections_end, *tsec; if (bfd_get_flavour (templ) != bfd_target_elf_flavour) error (_("add-symbol-file-from-memory not supported for this target")); @@ -132,22 +131,7 @@ symbol_file_add_from_memory (struct bfd *templ, CORE_ADDR addr, from_tty ? SYMFILE_VERBOSE : 0, sai, OBJF_SHARED, NULL); - sections = NULL; - sections_end = NULL; - - if (build_section_table (nbfd, §ions, §ions_end) == 0) - { - make_cleanup (xfree, sections); - - /* Adjust the target section addresses by the load address. */ - for (tsec = sections; tsec != sections_end; ++tsec) - { - tsec->addr += loadbase; - tsec->endaddr += loadbase; - } - - add_target_sections (&nbfd, sections, sections_end); - } + add_target_sections_of_objfile (objf); /* This might change our ideas about frames already looked at. */ reinit_frame_cache (); diff --git a/gdb/symfile.c b/gdb/symfile.c index 64a83c684a0..7ad4a44fa63 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -3892,8 +3892,8 @@ symfile_find_segment_sections (struct objfile *objfile) static void symfile_free_objfile (struct objfile *objfile) { - /* Remove the target sections of user-added objfiles. */ - if (objfile != 0 && objfile->flags & OBJF_USERLOADED) + /* Remove the target sections owned by this objfile. */ + if (objfile != NULL) remove_target_sections ((void *) objfile); }