gdb/
authorJan Kratochvil <jan.kratochvil@redhat.com>
Fri, 19 Feb 2010 06:19:45 +0000 (06:19 +0000)
committerJan Kratochvil <jan.kratochvil@redhat.com>
Fri, 19 Feb 2010 06:19:45 +0000 (06:19 +0000)
* symfile.c (addr_info_make_relative): Extend comment.  Move SECT to
a more inner block.  Initialize ADDR by LOWER_OFFSET only if it was
found by bfd_get_section_by_name.
* symfile.h (struct section_addr_info) <sectindex>: New comment.

gdb/ChangeLog
gdb/symfile.c
gdb/symfile.h

index c962ea4..fe5a572 100644 (file)
@@ -1,3 +1,10 @@
+2010-02-19  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * symfile.c (addr_info_make_relative): Extend comment.  Move SECT to
+       a more inner block.  Initialize ADDR by LOWER_OFFSET only if it was
+       found by bfd_get_section_by_name.
+       * symfile.h (struct section_addr_info) <sectindex>: New comment.
+
 2010-02-19  Joel Brobecker  <brobecker@adacore.com>
 
        * NEWS: Add new "[...] since 7.1" section.  Rename the "[...] since
index 53266a7..8705420 100644 (file)
@@ -562,13 +562,13 @@ relative_addr_info_to_section_offsets (struct section_offsets *section_offsets,
 }
 
 /* Relativize absolute addresses in ADDRS into offsets based on ABFD.  Fill-in
-   also SECTINDEXes there.  */
+   also SECTINDEXes specific to ABFD there.  This function can be used to
+   rebase ADDRS to start referencing different BFD than before.  */
 
 void
 addr_info_make_relative (struct section_addr_info *addrs, bfd *abfd)
 {
   asection *lower_sect;
-  asection *sect;
   CORE_ADDR lower_offset;
   int i;
 
@@ -597,25 +597,29 @@ addr_info_make_relative (struct section_addr_info *addrs, bfd *abfd)
 
   for (i = 0; i < addrs->num_sections && addrs->other[i].name; i++)
     {
-      if (addrs->other[i].addr != 0)
+      asection *sect = bfd_get_section_by_name (abfd, addrs->other[i].name);
+
+      if (sect)
        {
-         sect = bfd_get_section_by_name (abfd, addrs->other[i].name);
-         if (sect)
+         /* This is the index used by BFD. */
+         addrs->other[i].sectindex = sect->index;
+
+         if (addrs->other[i].addr != 0)
            {
              addrs->other[i].addr -= bfd_section_vma (abfd, sect);
              lower_offset = addrs->other[i].addr;
-             /* This is the index used by BFD. */
-             addrs->other[i].sectindex = sect->index;
            }
          else
-           {
-             warning (_("section %s not found in %s"), addrs->other[i].name,
-                      bfd_get_filename (abfd));
-             addrs->other[i].addr = 0;
-           }
+           addrs->other[i].addr = lower_offset;
        }
       else
-       addrs->other[i].addr = lower_offset;
+       {
+         warning (_("section %s not found in %s"), addrs->other[i].name,
+                  bfd_get_filename (abfd));
+         addrs->other[i].addr = 0;
+
+         /* SECTINDEX is invalid if ADDR is zero.  */
+       }
     }
 }
 
index 302c29f..fe95255 100644 (file)
@@ -80,6 +80,8 @@ struct section_addr_info
   {
     CORE_ADDR addr;
     char *name;
+
+    /* SECTINDEX must be valid for associated BFD if ADDR is not zero.  */
     int sectindex;
   } other[1];
 };