* elf32-hppa.c (hppa_record_segment_addr): Locate the segment
authorNick Clifton <nickc@redhat.com>
Fri, 28 Dec 2007 14:45:34 +0000 (14:45 +0000)
committerNick Clifton <nickc@redhat.com>
Fri, 28 Dec 2007 14:45:34 +0000 (14:45 +0000)
  containing the section using the segment map, rather than guessing
  based upon the section's vma and file position.

bfd/ChangeLog
bfd/elf32-hppa.c

index ef64819..a00def0 100644 (file)
@@ -1,3 +1,9 @@
+2007-12-28  Nick Hudson  <nick.hudson@dsl.pipex.com>
+
+       * elf32-hppa.c (hppa_record_segment_addr): Locate the segment
+       containing the section using the segment map, rather than guessing
+       based upon the section's vma and file position.
+
 2007-12-24  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR binutils/5488
index 0da7e6d..20a2f80 100644 (file)
@@ -3266,8 +3266,30 @@ hppa_record_segment_addr (bfd *abfd ATTRIBUTE_UNUSED,
 
   if ((section->flags & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
     {
-      bfd_vma value = section->vma - section->filepos;
+      bfd_vma value;
+      struct elf_segment_map *m;
+      Elf_Internal_Phdr *p;
+
+      /* Find the segment that contains the output_section for this section.  */
+      for (m = elf_tdata (abfd)->segment_map,
+            p = elf_tdata (abfd)->phdr;
+          m != NULL;
+          m = m->next, p++)
+       {
+         int i;
+
+         for (i = m->count - 1; i >= 0; i--)
+           if (m->sections[i] == section->output_section)
+             break;
+         if (i >= 0)
+           break;
+       }
 
+      if (m == NULL)
+        return;
+
+      value = p->p_vaddr;
+      
       if ((section->flags & SEC_READONLY) != 0)
        {
          if (value < htab->text_segment_base)