From de34d42812a0b978b278cd344abeaee7c71fa55c Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Thu, 24 Dec 2020 15:56:23 +1030 Subject: PR27100, final link failed: bad value 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. --- ld/ChangeLog | 14 ++++++++++++++ ld/ldlang.c | 4 +++- ld/ldlang.h | 3 +++ ld/testsuite/ld-scripts/data.d | 1 + ld/testsuite/ld-scripts/data.exp | 9 +-------- ld/testsuite/ld-scripts/fill.d | 1 + ld/testsuite/ld-scripts/fill16.d | 1 + ld/testsuite/ld-scripts/pr27100.d | 10 ++++++++++ ld/testsuite/ld-scripts/pr27100.s | 2 ++ ld/testsuite/ld-scripts/pr27100.t | 2 ++ 10 files changed, 38 insertions(+), 9 deletions(-) create mode 100644 ld/testsuite/ld-scripts/pr27100.d create mode 100644 ld/testsuite/ld-scripts/pr27100.s create mode 100644 ld/testsuite/ld-scripts/pr27100.t (limited to 'ld') diff --git a/ld/ChangeLog b/ld/ChangeLog index c34409c..7d67ef2 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,17 @@ +2020-12-24 Alan Modra + + 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 * NEWS: Mention LAM_U48 and LAM_U57 support. diff --git a/ld/ldlang.c b/ld/ldlang.c index 41000da..a2b6b4d 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -1526,6 +1526,8 @@ lang_output_section_statement_lookup (const char *name, 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; } @@ -2387,7 +2389,7 @@ init_os (lang_output_section_statement_type *s, flagword flags) 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, diff --git a/ld/ldlang.h b/ld/ldlang.h index 0f1b607..fe601a8 100644 --- a/ld/ldlang.h +++ b/ld/ldlang.h @@ -173,6 +173,9 @@ typedef struct lang_output_section_statement_struct 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 diff --git a/ld/testsuite/ld-scripts/data.d b/ld/testsuite/ld-scripts/data.d index b7ca0a7..9784672 100644 --- a/ld/testsuite/ld-scripts/data.d +++ b/ld/testsuite/ld-scripts/data.d @@ -1,6 +1,7 @@ #source: data.s #ld: -T data.t #objdump: -s -j .text +#notarget: [is_aout_format] #xfail: tic4x-*-* tic54x-*-* .*: file format .* diff --git a/ld/testsuite/ld-scripts/data.exp b/ld/testsuite/ld-scripts/data.exp index 4e20cf7..673b2f5 100644 --- a/ld/testsuite/ld-scripts/data.exp +++ b/ld/testsuite/ld-scripts/data.exp @@ -19,14 +19,6 @@ # 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" @@ -35,5 +27,6 @@ if { [is_xcoff_format] } then { run_dump_test data run_dump_test fill run_dump_test fill16 +run_dump_test pr27100 set LDFLAGS $old_LDFLAGS diff --git a/ld/testsuite/ld-scripts/fill.d b/ld/testsuite/ld-scripts/fill.d index 54715c5..d3b5ea9 100644 --- a/ld/testsuite/ld-scripts/fill.d +++ b/ld/testsuite/ld-scripts/fill.d @@ -3,6 +3,7 @@ #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* diff --git a/ld/testsuite/ld-scripts/fill16.d b/ld/testsuite/ld-scripts/fill16.d index 19be5f2..91dc0a0 100644 --- a/ld/testsuite/ld-scripts/fill16.d +++ b/ld/testsuite/ld-scripts/fill16.d @@ -3,6 +3,7 @@ #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-*-* diff --git a/ld/testsuite/ld-scripts/pr27100.d b/ld/testsuite/ld-scripts/pr27100.d new file mode 100644 index 0000000..28b5875 --- /dev/null +++ b/ld/testsuite/ld-scripts/pr27100.d @@ -0,0 +1,10 @@ +#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 diff --git a/ld/testsuite/ld-scripts/pr27100.s b/ld/testsuite/ld-scripts/pr27100.s new file mode 100644 index 0000000..3eb147d --- /dev/null +++ b/ld/testsuite/ld-scripts/pr27100.s @@ -0,0 +1,2 @@ + .data + .space 80 diff --git a/ld/testsuite/ld-scripts/pr27100.t b/ld/testsuite/ld-scripts/pr27100.t new file mode 100644 index 0000000..b94b8e9 --- /dev/null +++ b/ld/testsuite/ld-scripts/pr27100.t @@ -0,0 +1,2 @@ +SECTIONS { .data ALIGN (16) : { aa = .; LONG(0xdeadbeef); . = ALIGN (16); } } +SECTIONS { .data ALIGN (16) : { bb = .; LONG(0x00c0ffee); . = ALIGN (16); } } -- cgit v1.1