aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ld/ChangeLog9
-rw-r--r--ld/NEWS3
-rw-r--r--ld/ldlang.c14
-rw-r--r--ld/testsuite/ld-elf/orphan-10.d10
-rw-r--r--ld/testsuite/ld-elf/orphan-10.s8
-rw-r--r--ld/testsuite/ld-elf/orphan-9.ld10
6 files changed, 47 insertions, 7 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index c1c977a..adefe32 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,5 +1,14 @@
2017-03-09 Andrew Burgess <andrew.burgess@embecosm.com>
+ * ldlang.c (lang_size_sections_1): Shortcut loop only after
+ tracking changes to the default regions LMA.
+ * testsuite/ld-elf/orphan-9.ld: Extend header comment.
+ * testsuite/ld-elf/orphan-10.d: New file.
+ * testsuite/ld-elf/orphan-10.s: New file.
+ * NEWS: Mention change in behaviour.
+
+2017-03-09 Andrew Burgess <andrew.burgess@embecosm.com>
+
* ldlang.c (lang_leave_output_section_statement): Move lma_region
logic to...
(lang_propagate_lma_regions): ...this new function.
diff --git a/ld/NEWS b/ld/NEWS
index 86e9073..972e7a8 100644
--- a/ld/NEWS
+++ b/ld/NEWS
@@ -8,6 +8,9 @@
* Improve assignment of LMAs to orphan sections in some edge cases where a
mixture of both AT>LMA_REGION and AT(LMA) are used.
+* Orphan sections placed after an empty section that has an AT(LMA) will now
+ take an load memory address starting from LMA.
+
Changes in 2.28:
* The EXCLUDE_FILE linker script construct can now be applied outside of the
diff --git a/ld/ldlang.c b/ld/ldlang.c
index 89b896f..6011a00 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -5197,9 +5197,6 @@ lang_size_sections_1
}
os->processed_lma = TRUE;
- if (bfd_is_abs_section (os->bfd_section) || os->ignored)
- break;
-
/* Keep track of normal sections using the default
lma region. We use this to set the lma for
following sections. Overlays or other linker
@@ -5207,7 +5204,13 @@ lang_size_sections_1
default lma == vma is incorrect.
To avoid warnings about dot moving backwards when using
-Ttext, don't start tracking sections until we find one
- of non-zero size or with lma set differently to vma. */
+ of non-zero size or with lma set differently to vma.
+ Do this tracking before we short-cut the loop so that we
+ track changes for the case where the section size is zero,
+ but the lma is set differently to the vma. This is
+ important, if an orphan section is placed after an
+ otherwise empty output section that has an explicit lma
+ set, we want that lma reflected in the orphans lma. */
if (!IGNORE_SECTION (os->bfd_section)
&& (os->bfd_section->size != 0
|| (r->last_os == NULL
@@ -5219,6 +5222,9 @@ lang_size_sections_1
&& !bfd_link_relocatable (&link_info))
r->last_os = s;
+ if (bfd_is_abs_section (os->bfd_section) || os->ignored)
+ break;
+
/* .tbss sections effectively have zero size. */
if (!IS_TBSS (os->bfd_section)
|| bfd_link_relocatable (&link_info))
diff --git a/ld/testsuite/ld-elf/orphan-10.d b/ld/testsuite/ld-elf/orphan-10.d
new file mode 100644
index 0000000..a5cf6d9
--- /dev/null
+++ b/ld/testsuite/ld-elf/orphan-10.d
@@ -0,0 +1,10 @@
+#source: orphan-10.s
+#ld: -N -T orphan-9.ld
+#objdump: -h
+#notarget: d30v-* dlx-* fr30-* frv-* ft32-* iq2000-* mn10200-* moxie-* ms1-* msp430-* mt-* pj-*
+
+#...
+ . \.text 0+(08|10) [0-9a-f]+ 0+200 .*
+#...
+ . \.data\.1 0+8 [0-9a-f]+ 0+300 .*
+#pass
diff --git a/ld/testsuite/ld-elf/orphan-10.s b/ld/testsuite/ld-elf/orphan-10.s
new file mode 100644
index 0000000..b198966
--- /dev/null
+++ b/ld/testsuite/ld-elf/orphan-10.s
@@ -0,0 +1,8 @@
+ .text
+ .byte 0, 0, 0, 0, 0, 0, 0, 0
+
+ .section ".data.1", "aw"
+ .byte 0, 0, 0, 0, 0, 0, 0, 0
+
+ .section ".rodata", "a"
+ .byte 0, 0, 0, 0, 0, 0, 0, 0
diff --git a/ld/testsuite/ld-elf/orphan-9.ld b/ld/testsuite/ld-elf/orphan-9.ld
index 1a6773d..d8a3917 100644
--- a/ld/testsuite/ld-elf/orphan-9.ld
+++ b/ld/testsuite/ld-elf/orphan-9.ld
@@ -1,8 +1,12 @@
-/* This linker script is used for orphan-9 test.
+/* This linker script is used for orphan-9 and orphan-10 test.
- We have a single byte in .data, and an orphan .data.1
+ orphan-9: We have a single byte in .data, and an orphan .data.1
section. We are checking that the .data.1 orphan is assigned an
- LMA after .data rather than picking up the lma region of .rodata. */
+ LMA after .data rather than picking up the lma region of .rodata.
+
+ orphan-10: In this case we have nothing in .data and an orphan
+ .data.1, we are checking that .data.1 is assigned an LMA after
+ .data, rather than defaulting to take LMA == VMA. */
MEMORY
{