The failure on this PR is due to using the same bfd section for
multiple output sections. Commit
21401fc7bf67 managed to create
duplicate linker script output section statements, but not the actual
bfd sections.
PR 27100
* ldlang.h (lang_output_section_statement_type): Add dup_output.
* ldlang.c (lang_output_section_statement_lookup): Set dup_output.
(init_os): Test dup_output rather than constraint.
* testsuite/ld-scripts/pr27100.d,
* testsuite/ld-scripts/pr27100.s,
* testsuite/ld-scripts/pr27100.t: New test.
* testsuite/ld-scripts/data.exp: Run it. Don't exclude aout here.
* testsuite/ld-scripts/data.d: Do so here instead.
* testsuite/ld-scripts/fill.d: Likewise.
* testsuite/ld-scripts/fill16.d: Likewise.
+2020-12-24 Alan Modra <amodra@gmail.com>
+
+ PR 27100
+ * ldlang.h (lang_output_section_statement_type): Add dup_output.
+ * ldlang.c (lang_output_section_statement_lookup): Set dup_output.
+ (init_os): Test dup_output rather than constraint.
+ * testsuite/ld-scripts/pr27100.d,
+ * testsuite/ld-scripts/pr27100.s,
+ * testsuite/ld-scripts/pr27100.t: New test.
+ * testsuite/ld-scripts/data.exp: Run it. Don't exclude aout here.
+ * testsuite/ld-scripts/data.d: Do so here instead.
+ * testsuite/ld-scripts/fill.d: Likewise.
+ * testsuite/ld-scripts/fill16.d: Likewise.
+
2020-12-23 H.J. Lu <hongjiu.lu@intel.com>
* NEWS: Mention LAM_U48 and LAM_U57 support.
entry->s.output_section_statement.name = name;
entry->s.output_section_statement.constraint = constraint;
+ entry->s.output_section_statement.dup_output = (create == 2
+ || constraint == SPECIAL);
return &entry->s.output_section_statement;
}
if (strcmp (s->name, DISCARD_SECTION_NAME) == 0)
einfo (_("%F%P: illegal use of `%s' section\n"), DISCARD_SECTION_NAME);
- if (s->constraint != SPECIAL)
+ if (!s->dup_output)
s->bfd_section = bfd_get_section_by_name (link_info.output_bfd, s->name);
if (s->bfd_section == NULL)
s->bfd_section = bfd_make_section_anyway_with_flags (link_info.output_bfd,
unsigned int after_end : 1;
/* If this section uses the alignment of its input sections. */
unsigned int align_lma_with_input : 1;
+ /* If script has duplicate output section statements of the same name
+ create duplicate output sections. */
+ unsigned int dup_output : 1;
} lang_output_section_statement_type;
typedef struct
#source: data.s
#ld: -T data.t
#objdump: -s -j .text
+#notarget: [is_aout_format]
#xfail: tic4x-*-* tic54x-*-*
.*: file format .*
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
# MA 02110-1301, USA.
-# An a.out "objdump -s -j .text" has the file header visible inside the
-# text segment, confusing run_dump_test.
-if {[is_aout_format]} {
- unsupported data
- unsupported fill
- return
-}
-
set old_LDFLAGS $LDFLAGS
if { [is_xcoff_format] } then {
set LDFLAGS "$LDFLAGS -bnogc"
run_dump_test data
run_dump_test fill
run_dump_test fill16
+run_dump_test pr27100
set LDFLAGS $old_LDFLAGS
#source: fill_2.s
#ld: -T fill.t
#objdump: -s -j .text
+#notarget: [is_aout_format]
#skip: ia64-*-* mips*-*-freebsd* mips*-*-gnu* mips*-*-irix* mips*-*-kfreebsd*
#skip: mips*-*-linux* mips*-*-netbsd* mips*-*-openbsd* mips*-*-sysv4*
#skip: tilegx*-*-* tilepro-*-* x86_64-*-cygwin x86_64-*-mingw* x86_64-*-pe*
#source: fill16_2.s
#ld: -T fill.t
#objdump: -s -j .text
+#notarget: [is_aout_format]
#skip: arm-*-coff i[3-7]86-*-coff [is_xcoff_format]
#xfail: alpha*-*-*ecoff sh-*-pe sparc*-*-coff
#xfail: tic30-*-coff tic4x-*-* tic54x-*-* z8k-*-*
--- /dev/null
+#ld: -r -T pr27100.t
+#objdump: -h
+#notarget: [is_aout_format]
+#xfail: alpha*-*-*vms* mmix-*-* *c54x-*-* [is_xcoff_format]
+
+#...
+.* \.data +0+60 .*
+#...
+.* \.data +0+10 .*
+#pass
--- /dev/null
+ .data
+ .space 80
--- /dev/null
+SECTIONS { .data ALIGN (16) : { aa = .; LONG(0xdeadbeef); . = ALIGN (16); } }
+SECTIONS { .data ALIGN (16) : { bb = .; LONG(0x00c0ffee); . = ALIGN (16); } }