* elf.c (_bfd_elf_make_section_from_shdr): Don't set lma based on
authorAlan Modra <amodra@gmail.com>
Sat, 23 Mar 2002 13:14:33 +0000 (13:14 +0000)
committerAlan Modra <amodra@gmail.com>
Sat, 23 Mar 2002 13:14:33 +0000 (13:14 +0000)
section file offset for !SEC_LOAD sections.

bfd/ChangeLog
bfd/elf.c

index 8844994..3b53150 100644 (file)
@@ -1,3 +1,8 @@
+2002-03-23  Alan Modra  <amodra@bigpond.net.au>
+
+       * elf.c (_bfd_elf_make_section_from_shdr): Don't set lma based on
+       section file offset for !SEC_LOAD sections.
+
 2002-03-21  Richard Earnshaw  <rearnsha@arm.com>
 
        * elf32-arm.h (elf32_arm_final_link_relocate case R_ARM_GOTOFF)
index 5221f72..020771b 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -655,9 +655,9 @@ _bfd_elf_make_section_from_shdr (abfd, hdr, name)
 
                 Note - we used to check the p_paddr field as well, and
                 refuse to set the LMA if it was 0.  This is wrong
-                though as a perfectly valid, initialised segment can
+                though, as a perfectly valid initialised segment can
                 have a p_paddr of zero.  Some architectures, eg ARM,
-                place special significance one the address 0 and
+                place special significance on the address 0 and
                 executables need to be able to have a segment which
                 covers this address.  */
              if (phdr->p_type == PT_LOAD
@@ -668,15 +668,18 @@ _bfd_elf_make_section_from_shdr (abfd, hdr, name)
                      || (phdr->p_offset + phdr->p_filesz
                          >= hdr->sh_offset + hdr->sh_size)))
                {
-                 /* We used to do a relative adjustment here, but
-                    that doesn't work if the segment is packed with
-                    code from multiple VMAs.  Instead we calculate
-                    the LMA absoultely, based on the LMA of the
-                    segment (it is assumed that the segment will
-                    contain sections with contiguous LMAs, even if
-                    the VMAs are not).  */
-                 newsect->lma = phdr->p_paddr
-                   + hdr->sh_offset - phdr->p_offset;
+                 if ((flags & SEC_LOAD) == 0)
+                   newsect->lma += phdr->p_paddr - phdr->p_vaddr;
+                 else
+                   /* We used to use the same adjustment for SEC_LOAD
+                      sections, but that doesn't work if the segment
+                      is packed with code from multiple VMAs.
+                      Instead we calculate the section LMA based on
+                      the segment LMA.  It is assumed that the
+                      segment will contain sections with contiguous
+                      LMAs, even if the VMAs are not.  */
+                   newsect->lma = (phdr->p_paddr
+                                   + hdr->sh_offset - phdr->p_offset);
                  break;
                }
            }