[binutils-gdb] PR27100, final link failed: bad value
Alan Modra
amodra@sourceware.org
Thu Dec 24 12:33:59 GMT 2020
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=de34d42812a0b978b278cd344abeaee7c71fa55c
commit de34d42812a0b978b278cd344abeaee7c71fa55c
Author: Alan Modra <amodra@gmail.com>
Date: Thu Dec 24 15:56:23 2020 +1030
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.
Diff:
---
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(-)
diff --git a/ld/ChangeLog b/ld/ChangeLog
index c34409c575f..7d67ef200a7 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 41000da1e15..a2b6b4dc0ab 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 0f1b607f735..fe601a8547f 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 b7ca0a741ce..9784672db46 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 4e20cf7ec15..673b2f5a4d1 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 54715c58d8e..d3b5ea939ce 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 19be5f2c46d..91dc0a0b40b 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 00000000000..28b5875dbce
--- /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 00000000000..3eb147dd3a6
--- /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 00000000000..b94b8e90a2d
--- /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); } }
More information about the Binutils-cvs
mailing list