gdb/
authorJan Kratochvil <jan.kratochvil@redhat.com>
Sat, 9 Jan 2010 09:11:00 +0000 (09:11 +0000)
committerJan Kratochvil <jan.kratochvil@redhat.com>
Sat, 9 Jan 2010 09:11:00 +0000 (09:11 +0000)
Fix displacement of separate debug info files.
* objfiles.c (objfile_relocate): Rename to ...
(objfile_relocate1): ... here and make it static.  Extend the comment.
(objfile_relocate): New function.
* solib-spu.c (spu_relocate_main_executable): Explicitly check if
SYMFILE_OBJFILE is NULL.  Remove variables objfile and old_chain.
Remove following of SEPARATE_DEBUG_OBJFILE.  new_offsets is now
allocated using alloca.
* symfile.c (copy_section_addr_info): Remove.
(build_section_addr_info_from_objfile): Make it global.  New variables
addr_bit and mask, use them.
* symfile.h (build_section_addr_info_from_objfile): New prototype.
(copy_section_addr_info): Remove.

gdb/ChangeLog
gdb/objfiles.c
gdb/solib-spu.c
gdb/symfile.c
gdb/symfile.h

index 1ff5f35..da66b7b 100644 (file)
@@ -1,3 +1,19 @@
+2010-01-09  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       Fix displacement of separate debug info files.
+       * objfiles.c (objfile_relocate): Rename to ...
+       (objfile_relocate1): ... here and make it static.  Extend the comment.
+       (objfile_relocate): New function.
+       * solib-spu.c (spu_relocate_main_executable): Explicitly check if
+       SYMFILE_OBJFILE is NULL.  Remove variables objfile and old_chain.
+       Remove following of SEPARATE_DEBUG_OBJFILE.  new_offsets is now
+       allocated using alloca.
+       * symfile.c (copy_section_addr_info): Remove.
+       (build_section_addr_info_from_objfile): Make it global.  New variables
+       addr_bit and mask, use them.
+       * symfile.h (build_section_addr_info_from_objfile): New prototype.
+       (copy_section_addr_info): Remove.
+
 2010-01-09  Joel Brobecker  <brobecker@adacore.com>
 
        Signal unwinder for mips-irix N32.
index 9f779a4..d1e441b 100644 (file)
@@ -693,9 +693,10 @@ free_all_objfiles (void)
 }
 \f
 /* Relocate OBJFILE to NEW_OFFSETS.  There should be OBJFILE->NUM_SECTIONS
-   entries in new_offsets.  */
-void
-objfile_relocate (struct objfile *objfile, struct section_offsets *new_offsets)
+   entries in new_offsets.  SEPARATE_DEBUG_OBJFILE is not touched here.  */
+
+static void
+objfile_relocate1 (struct objfile *objfile, struct section_offsets *new_offsets)
 {
   struct obj_section *s;
   struct section_offsets *delta =
@@ -849,6 +850,54 @@ objfile_relocate (struct objfile *objfile, struct section_offsets *new_offsets)
       exec_set_section_address (bfd_get_filename (objfile->obfd), idx,
                                obj_section_addr (s));
     }
+}
+
+/* Relocate OBJFILE to NEW_OFFSETS.  There should be OBJFILE->NUM_SECTIONS
+   entries in new_offsets.  Process also OBJFILE's SEPARATE_DEBUG_OBJFILEs.
+
+   The number and ordering of sections does differ between the two objfiles.
+   Only their names match.  Also the file offsets will differ (objfile being
+   possibly prelinked but separate_debug_objfile is probably not prelinked) but
+   the in-memory absolute address as specified by NEW_OFFSETS must match both
+   files.  */
+
+void
+objfile_relocate (struct objfile *objfile, struct section_offsets *new_offsets)
+{
+  struct objfile *debug_objfile;
+
+  objfile_relocate1 (objfile, new_offsets);
+
+  for (debug_objfile = objfile->separate_debug_objfile;
+       debug_objfile;
+       debug_objfile = objfile_separate_debug_iterate (objfile, debug_objfile))
+    {
+      struct section_addr_info *objfile_addrs;
+      struct section_offsets *new_debug_offsets;
+      int new_debug_num_sections;
+      struct cleanup *my_cleanups;
+
+      objfile_addrs = build_section_addr_info_from_objfile (objfile);
+      my_cleanups = make_cleanup (xfree, objfile_addrs);
+
+      /* Here OBJFILE_ADDRS contain the correct absolute addresses, the
+        relative ones must be already created according to debug_objfile.  */
+
+      addr_info_make_relative (objfile_addrs, debug_objfile->obfd);
+
+      gdb_assert (debug_objfile->num_sections
+                 == bfd_count_sections (debug_objfile->obfd));
+      new_debug_offsets = xmalloc (SIZEOF_N_SECTION_OFFSETS
+                                                (debug_objfile->num_sections));
+      make_cleanup (xfree, new_debug_offsets);
+      relative_addr_info_to_section_offsets (new_debug_offsets,
+                                            debug_objfile->num_sections,
+                                            objfile_addrs);
+
+      objfile_relocate1 (debug_objfile, new_debug_offsets);
+
+      do_cleanups (my_cleanups);
+    }
 
   /* Relocate breakpoints as necessary, after things are relocated. */
   breakpoint_re_set ();
index e752544..94a77fb 100644 (file)
 static void
 spu_relocate_main_executable (int spufs_fd)
 {
-  struct objfile *objfile;
-  struct cleanup *old_chain;
   struct section_offsets *new_offsets;
   int i;
 
-  for (objfile = symfile_objfile;
-       objfile;
-       objfile = objfile->separate_debug_objfile)
-    {
-      new_offsets = xcalloc (objfile->num_sections,
-                            sizeof (struct section_offsets));
-      old_chain = make_cleanup (xfree, new_offsets);
+  if (symfile_objfile == NULL)
+    return;
 
-      for (i = 0; i < objfile->num_sections; i++)
-        new_offsets->offsets[i] = SPUADDR (spufs_fd, 0);
+  new_offsets = alloca (symfile_objfile->num_sections
+                       * sizeof (struct section_offsets));
 
-      objfile_relocate (objfile, new_offsets);
-      do_cleanups (old_chain);
-    }
+  for (i = 0; i < symfile_objfile->num_sections; i++)
+    new_offsets->offsets[i] = SPUADDR (spufs_fd, 0);
+
+  objfile_relocate (symfile_objfile, new_offsets);
 }
 
 /* When running a stand-alone SPE executable, we may need to skip one more
index 42aff0d..89cc07c 100644 (file)
@@ -328,32 +328,6 @@ alloc_section_addr_info (size_t num_sections)
   return sap;
 }
 
-
-/* Return a freshly allocated copy of ADDRS.  The section names, if
-   any, are also freshly allocated copies of those in ADDRS.  */
-struct section_addr_info *
-copy_section_addr_info (struct section_addr_info *addrs)
-{
-  struct section_addr_info *copy
-    = alloc_section_addr_info (addrs->num_sections);
-  int i;
-
-  copy->num_sections = addrs->num_sections;
-  for (i = 0; i < addrs->num_sections; i++)
-    {
-      copy->other[i].addr = addrs->other[i].addr;
-      if (addrs->other[i].name)
-        copy->other[i].name = xstrdup (addrs->other[i].name);
-      else
-        copy->other[i].name = NULL;
-      copy->other[i].sectindex = addrs->other[i].sectindex;
-    }
-
-  return copy;
-}
-
-
-
 /* Build (allocate and populate) a section_addr_info struct from
    an existing section table. */
 
@@ -386,12 +360,17 @@ build_section_addr_info_from_section_table (const struct target_section *start,
 
 /* Create a section_addr_info from section offsets in OBJFILE.  */
 
-static struct section_addr_info *
+struct section_addr_info *
 build_section_addr_info_from_objfile (const struct objfile *objfile)
 {
   struct section_addr_info *sap;
   int i;
   struct bfd_section *sec;
+  int addr_bit = gdbarch_addr_bit (objfile->gdbarch);
+  CORE_ADDR mask = CORE_ADDR_MAX;
+
+  if (addr_bit < (sizeof (CORE_ADDR) * HOST_CHAR_BIT))
+    mask = ((CORE_ADDR) 1 << addr_bit) - 1;
 
   sap = alloc_section_addr_info (objfile->num_sections);
   for (i = 0, sec = objfile->obfd->sections;
@@ -400,7 +379,7 @@ build_section_addr_info_from_objfile (const struct objfile *objfile)
     {
       gdb_assert (sec != NULL);
       sap->other[i].addr = (bfd_get_section_vma (objfile->obfd, sec)
-                            + objfile->section_offsets->offsets[i]);
+                            + objfile->section_offsets->offsets[i]) & mask;
       sap->other[i].name = xstrdup (bfd_get_section_name (objfile->obfd, sec));
       sap->other[i].sectindex = sec->index;
     }
index 57e6286..7ae819c 100644 (file)
@@ -174,6 +174,9 @@ struct sym_fns
 
 };
 
+extern struct section_addr_info *
+          build_section_addr_info_from_objfile (const struct objfile *objfile);
+
 extern void relative_addr_info_to_section_offsets
   (struct section_offsets *section_offsets, int num_sections,
    struct section_addr_info *addrs);
@@ -254,11 +257,6 @@ extern char *find_separate_debug_file_by_debuglink (struct objfile *);
 extern struct section_addr_info *alloc_section_addr_info (size_t
                                                          num_sections);
 
-/* Return a freshly allocated copy of ADDRS.  The section names, if
-   any, are also freshly allocated copies of those in ADDRS.  */
-extern struct section_addr_info *(copy_section_addr_info 
-                                  (struct section_addr_info *addrs));
-
 /* Build (allocate and populate) a section_addr_info struct from an
    existing section table.  */