From: Alan Modra Date: Wed, 9 Oct 2019 10:55:25 +0000 (+1030) Subject: PR25081, Discrepancy between VMA and LMA after ALIGN X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8610e0fd93ea253f9beb9ebb6e50e8807ed83327;p=binutils-gdb.git PR25081, Discrepancy between VMA and LMA after ALIGN 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. --- diff --git a/ld/ChangeLog b/ld/ChangeLog index c20425b5356..d3d045c8f4d 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,9 @@ +2019-10-09 Alan Modra + + PR 25081 + * ldlang.c (lang_size_sections_1): Set lma from section vma + rather than dot. + 2019-10-08 Alan Modra * testsuite/ld-powerpc/localgot.s, diff --git a/ld/ldlang.c b/ld/ldlang.c index 2f72a7cdfdb..df7f6594863 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -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);