x86: correct overflow checking for 16-bit PC-relative relocs
authorJan Beulich <jbeulich@suse.com>
Mon, 26 Apr 2021 08:41:35 +0000 (10:41 +0200)
committerJan Beulich <jbeulich@suse.com>
Mon, 26 Apr 2021 08:41:35 +0000 (10:41 +0200)
commita7664973b24a242cd9ea17deb5eaf503065fc0bd
tree4022b58da916ab136085e8e19bbaf812e438a678
parent8fb8824599f37a726685197a1728e92bc7a953e5
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).
bfd/ChangeLog
bfd/elf32-i386.c
bfd/elf64-x86-64.c
ld/ChangeLog
ld/testsuite/ld-i386/i386.exp
ld/testsuite/ld-i386/pcrel16-2.d [new file with mode: 0644]
ld/testsuite/ld-i386/pcrel16-2.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/pcrel16-2.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/x86-64.exp