+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
* 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
}
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
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
&& !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))
--- /dev/null
+#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
--- /dev/null
+ .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
-/* 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
{