mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-18 14:53:32 +08:00
14ea2c1b23
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.
33 lines
793 B
Plaintext
33 lines
793 B
Plaintext
/* This linker script is used for orphan-9 and orphan-10 test.
|
|
|
|
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.
|
|
|
|
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
|
|
{
|
|
MEM : ORIGIN = 0x1000, LENGTH = 0x100
|
|
TEXT : ORIGIN = 0x200, LENGTH = 0x50
|
|
DATA : ORIGIN = 0x300, LENGTH = 0x50
|
|
RODATA : ORIGIN = 0x400, LENGTH = 0x50
|
|
}
|
|
|
|
SECTIONS
|
|
{
|
|
.text : {
|
|
*(.text)
|
|
} >MEM AT>TEXT
|
|
|
|
.data : AT(0x300) {
|
|
*(.data)
|
|
} >MEM
|
|
|
|
.rodata : {
|
|
*(.rodata)
|
|
} >MEM AT>RODATA
|
|
}
|