diff options
author | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2019-02-07 17:02:24 +0100 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2019-02-07 17:13:32 +0100 |
commit | 1c92e98f548b70b08f01cf512ed755ef84e6f223 (patch) | |
tree | 8a5ebc350e3a217d12cc5ce67afb68bc3ced6dcf | |
parent | 262935666bb35e3434a4708262c6e5e120a5df12 (diff) | |
download | gdb-1c92e98f548b70b08f01cf512ed755ef84e6f223.zip gdb-1c92e98f548b70b08f01cf512ed755ef84e6f223.tar.gz gdb-1c92e98f548b70b08f01cf512ed755ef84e6f223.tar.bz2 |
Visium: fix bogus overflow check on 32-bit hosts
bfd/
* elf32-visium.c (visium_elf_howto_parity_reloc): Minor tweak.
<R_VISIUM_PC16>: Use explicit range test to detect an overflow.
-rw-r--r-- | bfd/ChangeLog | 5 | ||||
-rw-r--r-- | bfd/elf32-visium.c | 13 |
2 files changed, 11 insertions, 7 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 4486ee8..75ed014 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2019-02-07 Eric Botcazou <ebotcazou@adacore.com> + + * elf32-visium.c (visium_elf_howto_parity_reloc): Minor tweak. + <R_VISIUM_PC16>: Use explicit range test to detect an overflow. + 2018-12-12 Alan Modra <amodra@gmail.com> Apply from master diff --git a/bfd/elf32-visium.c b/bfd/elf32-visium.c index e8f1c4c..2846140 100644 --- a/bfd/elf32-visium.c +++ b/bfd/elf32-visium.c @@ -312,7 +312,6 @@ visium_elf_howto_parity_reloc (bfd * input_bfd, arelent *reloc_entry, bfd_vma relocation; bfd_byte *inplace_address; bfd_vma insn; - const bfd_vma signmask = 0xffff8000; /* This part is from bfd_elf_generic_reloc. If we're relocating, and this an external symbol, we don't want @@ -351,19 +350,19 @@ visium_elf_howto_parity_reloc (bfd * input_bfd, arelent *reloc_entry, if (reloc_entry->howto->pc_relative) { - relocation -= input_section->output_section->vma - + input_section->output_offset; + relocation -= input_section->output_section->vma; + relocation -= input_section->output_offset; relocation -= reloc_entry->address; } switch (reloc_entry->howto->type) { case R_VISIUM_PC16: - relocation >>= 2; - if (ret == bfd_reloc_ok && (relocation & signmask) != 0 - && (relocation & signmask) != signmask) + if (ret == bfd_reloc_ok + && ((bfd_signed_vma) relocation < -0x20000 + || (bfd_signed_vma) relocation > 0x1ffff)) ret = bfd_reloc_overflow; - relocation &= 0xffff; + relocation = (relocation >> 2) & 0xffff; break; case R_VISIUM_HI16: case R_VISIUM_HI16_PCREL: |