aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ld/ChangeLog14
-rw-r--r--ld/ldlang.c4
-rw-r--r--ld/ldlang.h3
-rw-r--r--ld/testsuite/ld-scripts/data.d1
-rw-r--r--ld/testsuite/ld-scripts/data.exp9
-rw-r--r--ld/testsuite/ld-scripts/fill.d1
-rw-r--r--ld/testsuite/ld-scripts/fill16.d1
-rw-r--r--ld/testsuite/ld-scripts/pr27100.d10
-rw-r--r--ld/testsuite/ld-scripts/pr27100.s2
-rw-r--r--ld/testsuite/ld-scripts/pr27100.t2
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); } }