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 86b304ae34f..8cd61b36754 100644 --- a/gas/testsuite/gas/elf/elf.exp +++ b/gas/testsuite/gas/elf/elf.exp @@ -303,6 +303,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..88807a196a7 --- /dev/null +++ b/gas/testsuite/gas/elf/section-symbol-redef.d @@ -0,0 +1,6 @@ +#readelf: -x myseg +#skip: bfin-*-* +#skip: 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