aboutsummaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
Diffstat (limited to 'ld')
-rw-r--r--ld/ChangeLog14
-rw-r--r--ld/ldlang.c46
-rw-r--r--ld/testsuite/ld-elf/orphan-11.d9
-rw-r--r--ld/testsuite/ld-elf/orphan-11.ld16
-rw-r--r--ld/testsuite/ld-elf/orphan-11.s11
-rw-r--r--ld/testsuite/ld-elf/orphan-12.d9
-rw-r--r--ld/testsuite/ld-elf/orphan-12.s8
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