If the LMA for a segment is known, use it for matching sections to segments.
authorNick Clifton <nickc@redhat.com>
Tue, 30 Oct 2001 11:40:28 +0000 (11:40 +0000)
committerNick Clifton <nickc@redhat.com>
Tue, 30 Oct 2001 11:40:28 +0000 (11:40 +0000)
Use the LMA when adjusting for inter-section alignment padding.

bfd/ChangeLog
bfd/elf.c

index 0a131cff9b57f124be743fb0d0aa92b623ac4b7d..2e4a5d147d714eadd06452ef1fe580f29ab1bc7f 100644 (file)
@@ -2,6 +2,10 @@
 
        * elf.c (_bfd_elf_make_section_from_shdr): Set the LMA based on the
        p_paddr of the segment that contains it.
+       (copy_private_bfd_data): If the LMA for a segment is known, use it
+       for matching sections to segments.
+       (assign_file_positions_for_segments): Use the LMA when adjusting
+       for inter-section alignment padding.
 
 2001-10-29  Kazu Hirata  <kazu@hxi.com>
 
index cf51607bcbe75b6a6adc7d1d2a533f29fcdaf836..c03bd4a5ce0651203f05e6527b6c4592613fbc1a 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -3262,10 +3262,10 @@ assign_file_positions_for_segments (abfd)
 
          /* The section may have artificial alignment forced by a
             link script.  Notice this case by the gap between the
-            cumulative phdr vma and the section's vma.  */
-         if (p->p_vaddr + p->p_memsz < sec->vma)
+            cumulative phdr lma and the section's lma.  */
+         if (p->p_paddr + p->p_memsz < sec->lma)
            {
-             bfd_vma adjust = sec->vma - (p->p_vaddr + p->p_memsz);
+             bfd_vma adjust = sec->lma - (p->p_paddr + p->p_memsz);
 
              p->p_memsz += adjust;
              off += adjust;
@@ -3994,16 +3994,19 @@ copy_private_bfd_data (ibfd, obfd)
 
   /* Decide if the given section should be included in the given segment.
      A section will be included if:
-       1. It is within the address space of the segment,
+       1. It is within the address space of the segment -- we use the LMA
+          if that is set for the segment and the VMA otherwise,
        2. It is an allocated segment,
        3. There is an output section associated with it,
        4. The section has not already been allocated to a previous segment.  */
-#define INCLUDE_SECTION_IN_SEGMENT(section, segment)   \
-  ((((IS_CONTAINED_BY_VMA (section, segment)           \
-      || IS_SOLARIS_PT_INTERP (segment, section))      \
-     && (section->flags & SEC_ALLOC) != 0)             \
-    || IS_COREFILE_NOTE (segment, section))            \
-   && section->output_section != NULL                  \
+#define INCLUDE_SECTION_IN_SEGMENT(section, segment)                   \
+  (((((segment->p_paddr                                                        \
+       ? IS_CONTAINED_BY_LMA (section, segment, segment->p_paddr)      \
+       : IS_CONTAINED_BY_VMA (section, segment))                       \
+      || IS_SOLARIS_PT_INTERP (segment, section))                      \
+     && (section->flags & SEC_ALLOC) != 0)                             \
+    || IS_COREFILE_NOTE (segment, section))                            \
+   && section->output_section != NULL                                  \
    && section->segment_mark == false)
 
   /* Returns true iff seg1 starts after the end of seg2.  */