symfile, vdso: remove target sections
authorMarkus Metzger <markus.t.metzger@intel.com>
Mon, 2 Jun 2014 09:35:22 +0000 (11:35 +0200)
committerMarkus Metzger <markus.t.metzger@intel.com>
Fri, 6 Jun 2014 07:40:02 +0000 (09:40 +0200)
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.

gdb/ChangeLog
gdb/symfile-mem.c
gdb/symfile.c

index 17f251b..458e218 100644 (file)
@@ -1,3 +1,10 @@
+2014-06-06  Markus Metzger  <markus.t.metzger@intel.com>
+
+       * 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  <ludo@gnu.org>
 
        * guile/scm-value.c (gdbscm_history_append_x): Use
index b29421e..ef48f7d 100644 (file)
@@ -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, &sections, &sections_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 ();
index 64a83c6..7ad4a44 100644 (file)
@@ -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);
 }