diff options
author | Jan Beulich <jbeulich@suse.com> | 2021-04-26 10:41:35 +0200 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2021-04-26 10:41:35 +0200 |
commit | a7664973b24a242cd9ea17deb5eaf503065fc0bd (patch) | |
tree | 4022b58da916ab136085e8e19bbaf812e438a678 /bfd/elf64-x86-64.c | |
parent | 8fb8824599f37a726685197a1728e92bc7a953e5 (diff) | |
download | gdb-a7664973b24a242cd9ea17deb5eaf503065fc0bd.zip gdb-a7664973b24a242cd9ea17deb5eaf503065fc0bd.tar.gz gdb-a7664973b24a242cd9ea17deb5eaf503065fc0bd.tar.bz2 |
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).
Diffstat (limited to 'bfd/elf64-x86-64.c')
-rw-r--r-- | bfd/elf64-x86-64.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index 1204b29..840555c 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -82,7 +82,7 @@ static reloc_howto_type x86_64_elf_howto_table[] = false), HOWTO(R_X86_64_16, 0, 1, 16, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_X86_64_16", false, 0xffff, 0xffff, false), - HOWTO(R_X86_64_PC16,0, 1, 16, true, 0, complain_overflow_bitfield, + HOWTO(R_X86_64_PC16, 0, 1, 16, true, 0, complain_overflow_signed, bfd_elf_generic_reloc, "R_X86_64_PC16", false, 0xffff, 0xffff, true), HOWTO(R_X86_64_8, 0, 0, 8, false, 0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_X86_64_8", false, 0xff, 0xff, false), |