diff --git a/gas/ChangeLog b/gas/ChangeLog index d9b57f8662..7c06ec9349 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,12 @@ +2020-08-17 Alex Coplan + + * 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 PR 26359 diff --git a/gas/config/obj-elf.c b/gas/config/obj-elf.c index de22b5a1da..c11a1da229 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 155f78efa7..2f9893b3d2 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 0000000000..2ce245246f --- /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 0000000000..87e65699b4 --- /dev/null +++ b/gas/testsuite/gas/elf/section-symbol-redef.s @@ -0,0 +1,3 @@ + myseg=not_defined_here + .section myseg + .byte 42