x86: reject relocations involving registers
authorJan Beulich <jbeulich@suse.com>
Wed, 23 Mar 2022 11:31:29 +0000 (12:31 +0100)
committerJan Beulich <jbeulich@suse.com>
Wed, 23 Mar 2022 11:31:29 +0000 (12:31 +0100)
To prevent fatal or even internal errors, add a simple check to
i386_validate_fix(), rejecting relocations when their target symbol is
an equate of a register (or resolved to reg_section for any other
reason).

gas/config/tc-i386.c
gas/testsuite/gas/i386/inval-equ-2.l

index 93eec1c9ed43c8765fa635b291d40fa4e3bff5ed..76177924d396aac6c787294e797c5ed8e509df0e 100644 (file)
@@ -14188,6 +14188,17 @@ i386_cons_align (int ignore ATTRIBUTE_UNUSED)
 int
 i386_validate_fix (fixS *fixp)
 {
+  if (fixp->fx_addsy && S_GET_SEGMENT(fixp->fx_addsy) == reg_section)
+    {
+      reloc_howto_type *howto;
+
+      howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
+      as_bad_where (fixp->fx_file, fixp->fx_line,
+                   _("invalid %s relocation against register"),
+                   howto ? howto->name : "<unknown>");
+      return 0;
+    }
+
 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
   if (fixp->fx_r_type == BFD_RELOC_SIZE32
       || fixp->fx_r_type == BFD_RELOC_SIZE64)
index 11f5e4ed3e9dba4a39c406d7739ef634ea462348..839bc8d3523719ef5a3ebf53f79cf724f56606f4 100644 (file)
@@ -1,4 +1,7 @@
 .*: Assembler messages:
+.*:3: Error: .*
+.*:5: Error: .*
+.*:8: Error: .*
 .*: Error: .*
 .*: Error: .*
 .*: Error: .*
@@ -15,6 +18,9 @@ GAS LISTING .*
 [      ]*6[    ]+\.globl  bar2
 [      ]*7[    ]+\.set    bar3,\(%eax\+1\)
 [      ]*8[    ]+\?\?\?\? A1......             mov bar3,%eax
+.*  Error: invalid .* relocation against register
+.*  Error: invalid .* relocation against register
+.*  Error: invalid .* relocation against register
 .*  Error: can't make global register symbol `bar1'
 .*  Error: can't make global register symbol `bar2'
 .*  Error: can't make global register symbol `bar3'