From: Andrew Waterman Date: Wed, 21 Dec 2016 20:47:13 +0000 (-0800) Subject: RISC-V/GAS: Improve handling of invalid relocs X-Git-Tag: users/ARM/embedded-binutils-2_28-branch-2017q1~60 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2398b2bad9812c7bada17563805ee61f72c8cc87;p=thirdparty%2Fbinutils-gdb.git 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 * config/tc-riscv.c (md_apply_fix): Report TLS relocations against constants. Report disallowed symbol subtractions. --- diff --git a/gas/ChangeLog b/gas/ChangeLog index 266f22e6f33..80857d7e378 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -11,6 +11,12 @@ * testsuite/gas/i386/x86-64-avx512_vpopcntdqd.d: Ditto. * testsuite/gas/i386/x86-64-avx512_vpopcntdqd.s: Ditto. +2017-01-09 Andrew Waterman + + * 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 Kito Cheng diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c index 3fe9e63a392..bf870e66d85 100644 --- a/gas/config/tc-riscv.c +++ b/gas/config/tc-riscv.c @@ -1879,7 +1879,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: @@ -2035,6 +2039,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) {