summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2019-10-09 21:25:25 +1030
committerAlan Modra <amodra@gmail.com>2019-10-11 09:11:55 +1030
commit4526ef25548f141529c3a31129e7962d69258d45 (patch)
tree83dc3f839a1d5b95e2e7b1b55f6d09f309effc0e
parentb094948c0943c996460cbc9ab3c14207dc520445 (diff)
downloadbinutils-4526ef25548f141529c3a31129e7962d69258d45.tar.gz
binutils-4526ef25548f141529c3a31129e7962d69258d45.tar.bz2
binutils-4526ef25548f141529c3a31129e7962d69258d45.zip
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. (cherry picked from commit 8610e0fd93ea253f9beb9ebb6e50e8807ed83327)
-rw-r--r--ld/ChangeLog8
-rw-r--r--ld/ldlang.c2
2 files changed, 9 insertions, 1 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 3a553de7cfd..f9bc13e5c99 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,11 @@
+2019-10-11 Alan Modra <amodra@gmail.com>
+
+ Apply from master
+ 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-10 Szabolcs Nagy <szabolcs.nagy@arm.com>
Apply from master
diff --git a/ld/ldlang.c b/ld/ldlang.c
index cb98982d45f..390546afae2 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -5500,7 +5500,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);