aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gas/ChangeLog9
-rw-r--r--gas/config/obj-elf.c9
-rw-r--r--gas/testsuite/gas/elf/elf.exp1
-rw-r--r--gas/testsuite/gas/elf/section-symbol-redef.d5
-rw-r--r--gas/testsuite/gas/elf/section-symbol-redef.s3
5 files changed, 26 insertions, 1 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index d9b57f8..7c06ec9 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,12 @@
+2020-08-17 Alex Coplan <alex.coplan@arm.com>
+
+ * config/obj-elf.c (obj_elf_change_section): When repurposing an
+ existing symbol, ensure that we set sy_value as per other (fresh)
+ section symbols.
+ * testsuite/gas/elf/elf.exp: Add new test.
+ * testsuite/gas/elf/section-symbol-redef.d: New test.
+ * testsuite/gas/elf/section-symbol-redef.s: Input for test.
+
2020-08-13 Nick Clifton <nickc@redhat.com>
PR 26359
diff --git a/gas/config/obj-elf.c b/gas/config/obj-elf.c
index de22b5a..c11a1da 100644
--- a/gas/config/obj-elf.c
+++ b/gas/config/obj-elf.c
@@ -759,7 +759,14 @@ obj_elf_change_section (const char *name,
/* Add a symbol for this section to the symbol table. */
secsym = symbol_find (name);
if (secsym != NULL)
- symbol_set_bfdsym (secsym, sec->symbol);
+ {
+ /* We could be repurposing an undefined symbol here: make sure we
+ reset sy_value to look like other section symbols in order to avoid
+ trying to incorrectly resolve this section symbol later on. */
+ static const expressionS expr = { .X_op = O_constant };
+ symbol_set_value_expression (secsym, &expr);
+ symbol_set_bfdsym (secsym, sec->symbol);
+ }
else
symbol_table_insert (section_symbol (sec));
}
diff --git a/gas/testsuite/gas/elf/elf.exp b/gas/testsuite/gas/elf/elf.exp
index 155f78e..2f9893b 100644
--- a/gas/testsuite/gas/elf/elf.exp
+++ b/gas/testsuite/gas/elf/elf.exp
@@ -305,6 +305,7 @@ if { [is_elf_format] } then {
run_dump_test "strtab"
run_dump_test "bignums"
+ run_dump_test "section-symbol-redef"
load_lib gas-dg.exp
dg-init
diff --git a/gas/testsuite/gas/elf/section-symbol-redef.d b/gas/testsuite/gas/elf/section-symbol-redef.d
new file mode 100644
index 0000000..2ce2452
--- /dev/null
+++ b/gas/testsuite/gas/elf/section-symbol-redef.d
@@ -0,0 +1,5 @@
+#readelf: -x myseg
+#notarget: bfin-*-* h8300-*
+
+Hex dump of section .*:
+ 0x0+ 2a\s+\*
diff --git a/gas/testsuite/gas/elf/section-symbol-redef.s b/gas/testsuite/gas/elf/section-symbol-redef.s
new file mode 100644
index 0000000..87e6569
--- /dev/null
+++ b/gas/testsuite/gas/elf/section-symbol-redef.s
@@ -0,0 +1,3 @@
+ myseg=not_defined_here
+ .section myseg
+ .byte 42