ld: Track changes to default region LMA even for empty sections
authorAndrew Burgess <andrew.burgess@embecosm.com>
Tue, 17 Jan 2017 19:13:29 +0000 (19:13 +0000)
committerAndrew Burgess <andrew.burgess@embecosm.com>
Thu, 9 Mar 2017 21:11:06 +0000 (21:11 +0000)
commit14ea2c1b230a62f312346fb16716b3dd4850815b
treedc74222ac0dccc9210afbc27a4c7e42ea1f3959d
parent77f5e65ecfb669ea1d2fd74b74fbbf0d0c20daf8
ld: Track changes to default region LMA even for empty sections

Given a linker script fragment like this:

   SECTIONS {
     . = 0x1000;
     .text   : AT(0x100) { *(.text)   }
     .data   : AT(0x200) { *(.data)   }
     .rodata : AT(0x300) { *(.rodata) }
   }

and an input file containing sections, '.text', '.data.1', and
'.rodata', then we'd expect the linker to place '.text' and '.rodata' in
the obvious way, and the '.data.1' orphan section would be located after
the '.data' section (assuming similar section properties).

Further, I believe that the expectation would be that the LMA for the
orphan '.data.1' section would start from 0x200 (as there is no '.data'
content).

However, right now, the LMA for '.data.1' would be 0x101, following on
from the '.text' section, this is because the change in LMA for the
'.data' section is not noticed by the linker, if there's no content in
the '.data' section.

What can be even more confusing to a user (though the cause is obvious
once you understand what's going on) is that adding some content to
'.data' will cause the orphan '.data.1' to switch to an LMA based off of
0x200.

This commit changes the behaviour so that an empty section that is in
the default lma region, and sets its lma, will adjust the lma of the
default region, this change will then be reflected in following sections
within the default lma memory region.

There's a new test to cover this issue that passes on a range of
targets, however, some targets generate additional sections, or have
stricter memory region size requirements that make it harder to come
up with a generic pass pattern, that still tests the required
features.  For now I've set the test to ignore these targets.

ld/ChangeLog:

* 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.
ld/ChangeLog
ld/NEWS
ld/ldlang.c
ld/testsuite/ld-elf/orphan-10.d [new file with mode: 0644]
ld/testsuite/ld-elf/orphan-10.s [new file with mode: 0644]
ld/testsuite/ld-elf/orphan-9.ld