x86: reject relocations involving registers
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).
This commit is contained in:
parent
64d23078e3
commit
e52a16f2aa
2 changed files with 17 additions and 0 deletions
|
@ -14188,6 +14188,17 @@ i386_cons_align (int ignore ATTRIBUTE_UNUSED)
|
||||||
int
|
int
|
||||||
i386_validate_fix (fixS *fixp)
|
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 defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
|
||||||
if (fixp->fx_r_type == BFD_RELOC_SIZE32
|
if (fixp->fx_r_type == BFD_RELOC_SIZE32
|
||||||
|| fixp->fx_r_type == BFD_RELOC_SIZE64)
|
|| fixp->fx_r_type == BFD_RELOC_SIZE64)
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
.*: Assembler messages:
|
.*: Assembler messages:
|
||||||
|
.*:3: Error: .*
|
||||||
|
.*:5: Error: .*
|
||||||
|
.*:8: Error: .*
|
||||||
.*: Error: .*
|
.*: Error: .*
|
||||||
.*: Error: .*
|
.*: Error: .*
|
||||||
.*: Error: .*
|
.*: Error: .*
|
||||||
|
@ -15,6 +18,9 @@ GAS LISTING .*
|
||||||
[ ]*6[ ]+\.globl bar2
|
[ ]*6[ ]+\.globl bar2
|
||||||
[ ]*7[ ]+\.set bar3,\(%eax\+1\)
|
[ ]*7[ ]+\.set bar3,\(%eax\+1\)
|
||||||
[ ]*8[ ]+\?\?\?\? A1...... mov bar3,%eax
|
[ ]*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 `bar1'
|
||||||
.* Error: can't make global register symbol `bar2'
|
.* Error: can't make global register symbol `bar2'
|
||||||
.* Error: can't make global register symbol `bar3'
|
.* Error: can't make global register symbol `bar3'
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue