]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
RISC-V/GAS: Improve handling of invalid relocs
authorAndrew Waterman <andrew@sifive.com>
Wed, 21 Dec 2016 20:47:13 +0000 (12:47 -0800)
committerPalmer Dabbelt <palmer@dabbelt.com>
Tue, 17 Jan 2017 05:33:14 +0000 (21:33 -0800)
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.

gas/ChangeLog
gas/config/tc-riscv.c

index 266f22e6f33382e34da8fab4bfbec6f9b2ff6154..80857d7e378e728ebcdb87ddefeff1358344595f 100644 (file)
        * testsuite/gas/i386/x86-64-avx512_vpopcntdqd.d: Ditto.
        * testsuite/gas/i386/x86-64-avx512_vpopcntdqd.s: Ditto.
 
+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>
 
index 3fe9e63a3920e8d4d1c61e42a8848a4edf4fcc77..bf870e66d8549693f4a5bf1402ea05b3dcfa347a 100644 (file)
@@ -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)
     {