diff options
-rw-r--r-- | gas/ChangeLog | 9 | ||||
-rw-r--r-- | gas/config/obj-elf.c | 9 | ||||
-rw-r--r-- | gas/testsuite/gas/elf/elf.exp | 1 | ||||
-rw-r--r-- | gas/testsuite/gas/elf/section-symbol-redef.d | 5 | ||||
-rw-r--r-- | gas/testsuite/gas/elf/section-symbol-redef.s | 3 |
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 |