diff options
-rw-r--r-- | ld/ChangeLog | 14 | ||||
-rw-r--r-- | ld/ldlang.c | 4 | ||||
-rw-r--r-- | ld/ldlang.h | 3 | ||||
-rw-r--r-- | ld/testsuite/ld-scripts/data.d | 1 | ||||
-rw-r--r-- | ld/testsuite/ld-scripts/data.exp | 9 | ||||
-rw-r--r-- | ld/testsuite/ld-scripts/fill.d | 1 | ||||
-rw-r--r-- | ld/testsuite/ld-scripts/fill16.d | 1 | ||||
-rw-r--r-- | ld/testsuite/ld-scripts/pr27100.d | 10 | ||||
-rw-r--r-- | ld/testsuite/ld-scripts/pr27100.s | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-scripts/pr27100.t | 2 |
10 files changed, 38 insertions, 9 deletions
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 <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. 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); } } |