summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Coplan <alex.coplan@arm.com>2020-08-17 14:23:14 +0100
committerAlex Coplan <alex.coplan@arm.com>2020-08-17 14:23:14 +0100
commitd4d05d13eba6e0ed01767999fc87e75599ddd86e (patch)
treef6334266eeab55c24929d359d6a38db7d936ef3d
parent53d5a2a5c146f98dd525eda2f33d7781666463bf (diff)
downloadbinutils-gdb-d4d05d13eba6e0ed01767999fc87e75599ddd86e.tar.gz
gas: Fix internal error in S_SET_SEGMENT
This patch fixes an internal error in GAS when defining a section using a symbol that has already been named but not defined. For a minimal reproducer, try the following input: a=b .sect a The problem is that obj_elf_change_section() happily reuses the symbol "a" created by equals() without clearing the sy_value field: prior to this patch, it just set bsym. This caused a problem when attempting to resolve the section symbol, since resolve_symbol_value() ended up resolving the symbol as if it were the original symbol created by equals(), which ends up leaving the section symbol in the undefined section instead of in section a, hence the call to abort() in S_SET_SEGMENT(). gas/ChangeLog: * 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.
-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 d9b57f8662b..7c06ec9349c 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 de22b5a1da8..c11a1da2295 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 155f78efa7f..2f9893b3d2b 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 00000000000..2ce245246f8
--- /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 00000000000..87e65699b48
--- /dev/null
+++ b/gas/testsuite/gas/elf/section-symbol-redef.s
@@ -0,0 +1,3 @@
+ myseg=not_defined_here
+ .section myseg
+ .byte 42