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/aarch64/section-symbol-redef.d b/gas/testsuite/gas/aarch64/section-symbol-redef.d new file mode 100644 index 00000000000..06a56b50553 --- /dev/null +++ b/gas/testsuite/gas/aarch64/section-symbol-redef.d @@ -0,0 +1,8 @@ +#objdump: -D + +.*: file format .* + +Disassembly of section myseg: + +0+ <.*>: +.*: d65f03c0 ret diff --git a/gas/testsuite/gas/aarch64/section-symbol-redef.s b/gas/testsuite/gas/aarch64/section-symbol-redef.s new file mode 100644 index 00000000000..a80398d129c --- /dev/null +++ b/gas/testsuite/gas/aarch64/section-symbol-redef.s @@ -0,0 +1,3 @@ +myseg=not_defined_here +.section myseg +ret