diff options
author | Andrew Waterman <andrew@sifive.com> | 2016-12-21 12:47:13 -0800 |
---|---|---|
committer | Palmer Dabbelt <palmer@dabbelt.com> | 2017-01-09 09:18:36 -0800 |
commit | e294484ee7e8dea53d091443a0f24c7939ac15ed (patch) | |
tree | e9c7cc778f2ea32840305b3ebe06254ca1634771 /gas | |
parent | 6ec11ab97ab47ec4a22118e5b1c77df567796002 (diff) | |
download | gdb-e294484ee7e8dea53d091443a0f24c7939ac15ed.zip gdb-e294484ee7e8dea53d091443a0f24c7939ac15ed.tar.gz gdb-e294484ee7e8dea53d091443a0f24c7939ac15ed.tar.bz2 |
RISC-V/GAS: Improve handling of invalid relocs
TLS relocs against constants previously segfaulted, and illegal
symbol subtractions were silently ignored.
The previous behavior was to segfault.
gas/ChangeLog
2017-01-09 Andrew Waterman <andrew@sifive.com>
* config/tc-riscv.c (md_apply_fix): Report TLS relocations against
constants. Report disallowed symbol subtractions.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 6 | ||||
-rw-r--r-- | gas/config/tc-riscv.c | 10 |
2 files changed, 15 insertions, 1 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 88f68a1..4de9cf7 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,9 @@ +2017-01-09 Andrew Waterman <andrew@sifive.com> + + * config/tc-riscv.c (append_insn): Don't eagerly apply relocations + against constants. + (md_apply_fix): Mark relocations against constants as "done." + 2017-01-09 Palmer Dabbelt <palmer@dabbelt.com> Kito Cheng <kito.cheng@gmail.com> diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c index b8da6ce..3f09101 100644 --- a/gas/config/tc-riscv.c +++ b/gas/config/tc-riscv.c @@ -1889,7 +1889,11 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED) case BFD_RELOC_RISCV_TLS_GD_HI20: case BFD_RELOC_RISCV_TLS_DTPREL32: case BFD_RELOC_RISCV_TLS_DTPREL64: - S_SET_THREAD_LOCAL (fixP->fx_addsy); + if (fixP->fx_addsy != NULL) + S_SET_THREAD_LOCAL (fixP->fx_addsy); + else + as_bad_where (fixP->fx_file, fixP->fx_line, + _("TLS relocation against a constant")); break; case BFD_RELOC_64: @@ -2045,6 +2049,10 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED) as_fatal (_("internal error: bad relocation #%d"), fixP->fx_r_type); } + if (fixP->fx_subsy != NULL) + as_bad_where (fixP->fx_file, fixP->fx_line, + _("unsupported symbol subtraction")); + /* Add an R_RISCV_RELAX reloc if the reloc is relaxable. */ if (relaxable && fixP->fx_tcbit && fixP->fx_addsy != NULL) { |