PR25081, Discrepancy between VMA and LMA after ALIGN
authorAlan Modra <amodra@gmail.com>
Wed, 9 Oct 2019 10:55:25 +0000 (21:25 +1030)
committerAlan Modra <amodra@gmail.com>
Wed, 9 Oct 2019 11:23:16 +0000 (21:53 +1030)
The testcase in the PR has two empty output sections, .sec1 with an
ALIGN and symbol assignment, and .sec2 just with an empty input
section.  The symbol assignment results in .sec1 being kept, but
because it is empty this section doesn't take space from the memory
region as you might expect from the ALIGN.  Instead the next section
.sec2, has vma/lma as if .sec1 wasn't present.  However, .sec2 is
discarded and os->ignored set, which unfortunately meant that dot
wasn't set from .sec2 vma.  That in turn results in .sec2 lma being
set incorrectly.  That vma/lma difference is then propagated to
.sec3 where it is seen as an overlap.

PR 25081
* ldlang.c (lang_size_sections_1): Set lma from section vma
rather than dot.

ld/ChangeLog
ld/ldlang.c

index c20425b5356eee9374a7eee611ec805e1f2d8f23..d3d045c8f4d9c6c374546663da609597a9663ed6 100644 (file)
@@ -1,3 +1,9 @@
+2019-10-09  Alan Modra  <amodra@gmail.com>
+
+       PR 25081
+       * ldlang.c (lang_size_sections_1): Set lma from section vma
+       rather than dot.
+
 2019-10-08  Alan Modra  <amodra@gmail.com>
 
        * testsuite/ld-powerpc/localgot.s,
index 2f72a7cdfdb8af46430dec925f677501233229e5..df7f65948636a24a1fd26602af65189e0a1a7dfb 100644 (file)
@@ -5691,7 +5691,7 @@ lang_size_sections_1
                    /* Otherwise, keep the same lma to vma relationship
                       as the previous section.  */
                    else
-                     lma = dot + last->lma - last->vma;
+                     lma = os->bfd_section->vma + last->lma - last->vma;
 
                    if (section_alignment > 0)
                      lma = align_power (lma, section_alignment);