diff options
-rw-r--r-- | ld/ChangeLog | 9 | ||||
-rw-r--r-- | ld/NEWS | 3 | ||||
-rw-r--r-- | ld/ldlang.c | 14 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/orphan-10.d | 10 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/orphan-10.s | 8 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/orphan-9.ld | 10 |
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. @@ -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 { |