mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-08-06 06:45:56 +08:00
x86: correct overflow checking for 16-bit PC-relative relocs
The only insn requiring a truly 16-bit PC-relative relocation outside of 16-bit mode is XBEGIN (with an operand size override). For it, the relocation generated should behave similar to 8- and (for 64-bit) 32-bit PC-relatives ones, i.e. be checked for a signed value to fit the field. This same mode is also correct for 16-bit code. Outside of 16-bit code, branches with operand size overrides act in a truly PC-relative way only when living in the low 32k of address space, as they truncate rIP to 16 bits. This can't be expressed by a PC-relative relocation. Putting in place a new testcase, I'd like to note that the two existing ones (pcrel16 and pcrel16abs) appear to be pretty pointless: They don't expect any error despite supposedly checking for overflow, and in fact there can't possibly be any error for the - former since gas doesn't emit any relocation in the first place there, - latter because the way the relocation gets expressed by gas doesn't allow the linker to notice the overflow; it should be detected by gas if at all, but see above (an error would be reported here for x86-64 afaict, but this test doesn't get re-used there).
This commit is contained in:
@ -93,7 +93,7 @@ static reloc_howto_type elf_howto_table[]=
|
||||
HOWTO(R_386_16, 0, 1, 16, false, 0, complain_overflow_bitfield,
|
||||
bfd_elf_generic_reloc, "R_386_16",
|
||||
true, 0xffff, 0xffff, false),
|
||||
HOWTO(R_386_PC16, 0, 1, 16, true, 0, complain_overflow_bitfield,
|
||||
HOWTO(R_386_PC16, 0, 1, 16, true, 0, complain_overflow_signed,
|
||||
bfd_elf_generic_reloc, "R_386_PC16",
|
||||
true, 0xffff, 0xffff, true),
|
||||
HOWTO(R_386_8, 0, 0, 8, false, 0, complain_overflow_bitfield,
|
||||
|
Reference in New Issue
Block a user