diff options
Diffstat (limited to 'ld')
-rw-r--r-- | ld/ChangeLog | 14 | ||||
-rw-r--r-- | ld/ldlang.c | 46 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/orphan-11.d | 9 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/orphan-11.ld | 16 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/orphan-11.s | 11 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/orphan-12.d | 9 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/orphan-12.s | 8 |
7 files changed, 98 insertions, 15 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index bf30370..e3faa79 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,17 @@ +2017-08-17 Andrew Burgess <andrew.burgess@embecosm.com> + + PR 21961 + * ldlang.c (lang_discard_section_p): New function. + (lang_add_section): Checks moved out into new function, which is + now called. + (lang_place_orphans): Call lang_discard_section_p instead of + duplicating some of the checks from lang_add_section. + * testsuite/ld-elf/orphan-11.d: New file. + * testsuite/ld-elf/orphan-11.ld: New file. + * testsuite/ld-elf/orphan-11.s: New file. + * testsuite/ld-elf/orphan-12.d: New file. + * testsuite/ld-elf/orphan-12.s: New file. + 2017-08-24 Alan Modra <amodra@gmail.com> * testsuite/ld-undefined/fundef.s: New test. diff --git a/ld/ldlang.c b/ld/ldlang.c index 196b2cc..96de2e2 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -2273,6 +2273,34 @@ section_already_linked (bfd *abfd, asection *sec, void *data) bfd_section_already_linked (abfd, sec, &link_info); } + +/* Returns true if SECTION is one we know will be discarded based on its + section flags, otherwise returns false. */ + +static bfd_boolean +lang_discard_section_p (asection *section) +{ + bfd_boolean discard; + flagword flags = section->flags; + + /* Discard sections marked with SEC_EXCLUDE. */ + discard = (flags & SEC_EXCLUDE) != 0; + + /* Discard the group descriptor sections when we're finally placing the + sections from within the group. */ + if ((flags & SEC_GROUP) != 0 + && link_info.resolve_section_groups) + discard = TRUE; + + /* Discard debugging sections if we are stripping debugging + information. */ + if ((link_info.strip == strip_debugger || link_info.strip == strip_all) + && (flags & SEC_DEBUGGING) != 0) + discard = TRUE; + + return discard; +} + /* The wild routines. These expand statements like *(.text) and foo.o to a list of @@ -2294,26 +2322,14 @@ lang_add_section (lang_statement_list_type *ptr, lang_input_section_type *new_section; bfd *abfd = link_info.output_bfd; - /* Discard sections marked with SEC_EXCLUDE. */ - discard = (flags & SEC_EXCLUDE) != 0; + /* Is this section one we know should be discarded? */ + discard = lang_discard_section_p (section); /* Discard input sections which are assigned to a section named DISCARD_SECTION_NAME. */ if (strcmp (output->name, DISCARD_SECTION_NAME) == 0) discard = TRUE; - /* Discard the group descriptor sections when we're finally placing the - sections from within the group. */ - if ((section->flags & SEC_GROUP) == SEC_GROUP - && link_info.resolve_section_groups) - discard = TRUE; - - /* Discard debugging sections if we are stripping debugging - information. */ - if ((link_info.strip == strip_debugger || link_info.strip == strip_all) - && (flags & SEC_DEBUGGING) != 0) - discard = TRUE; - if (discard) { if (section->output_section == NULL) @@ -6446,7 +6462,7 @@ lang_place_orphans (void) if (file->flags.just_syms) bfd_link_just_syms (file->the_bfd, s, &link_info); - else if ((s->flags & SEC_EXCLUDE) != 0) + else if (lang_discard_section_p (s)) s->output_section = bfd_abs_section_ptr; else if (strcmp (s->name, "COMMON") == 0) { diff --git a/ld/testsuite/ld-elf/orphan-11.d b/ld/testsuite/ld-elf/orphan-11.d new file mode 100644 index 0000000..3daefba --- /dev/null +++ b/ld/testsuite/ld-elf/orphan-11.d @@ -0,0 +1,9 @@ +#source: orphan-11.s +#ld: -T orphan-11.ld --orphan-handling=error +#objdump: -wh +#notarget: d30v-* dlx-* fr30-* frv-* ft32-* i860-* i960-* iq2000-* mn10200-* moxie-* ms1-* msp430-* mt-* pj-* + +#... + . \.text .* + . \.data .* +#pass diff --git a/ld/testsuite/ld-elf/orphan-11.ld b/ld/testsuite/ld-elf/orphan-11.ld new file mode 100644 index 0000000..74c7789 --- /dev/null +++ b/ld/testsuite/ld-elf/orphan-11.ld @@ -0,0 +1,16 @@ +SECTIONS +{ + . = SIZEOF_HEADERS; + .text : { *(.text .text.*) } + .data : { *(.data .data.*) } + .bss : { *(.bss .bss.*) *(COMMON) } + .sbss : { *(.sbss .sbss.*) } + .note : { *(.note .note.*) } + .rela : { *(.rela .rela.*) } + .rel : { *(.rel .rel.*) } + + /DISCARD/ : { + *(.reginfo) *(.MIPS.abiflags) *(.trampolines) *(.iplt*) + *(.note*) *(.got*) *(.igot*) *(.*.attributes) *(.*.info) + *(.pdr) "linker stubs*"(*) } +} diff --git a/ld/testsuite/ld-elf/orphan-11.s b/ld/testsuite/ld-elf/orphan-11.s new file mode 100644 index 0000000..3d7961b --- /dev/null +++ b/ld/testsuite/ld-elf/orphan-11.s @@ -0,0 +1,11 @@ + .section .text.foo,"axG",%progbits,foo_group + .word 0 + + .section .data.foo,"waG",%progbits,foo_group + .word 1 + + .section .text, "ax" + .word 0 + + .section .data, "wa" + .word 1 diff --git a/ld/testsuite/ld-elf/orphan-12.d b/ld/testsuite/ld-elf/orphan-12.d new file mode 100644 index 0000000..71a8c93 --- /dev/null +++ b/ld/testsuite/ld-elf/orphan-12.d @@ -0,0 +1,9 @@ +#source: orphan-12.s +#ld: -T orphan-11.ld --strip-debug --orphan-handling=error +#objdump: -wh +#notarget: d30v-* dlx-* fr30-* frv-* ft32-* i860-* i960-* iq2000-* mn10200-* moxie-* ms1-* msp430-* mt-* pj-* + +#... + . \.text .* + . \.data .* +#pass diff --git a/ld/testsuite/ld-elf/orphan-12.s b/ld/testsuite/ld-elf/orphan-12.s new file mode 100644 index 0000000..f9cbcf7 --- /dev/null +++ b/ld/testsuite/ld-elf/orphan-12.s @@ -0,0 +1,8 @@ + .section .debug_info, "",%progbits + .word 0 + + .section .text, "ax" + .word 0 + + .section .data, "wa" + .word 1 |