[PATCH] or1k: Avoid R_OR1K_GOT16 signed overflow by using special howto
Giulio Benetti
giulio.benetti@benettiengineering.com
Sun Jan 2 20:21:07 GMT 2022
Hi Stafford, All,
On 02/01/22 01:03, Stafford Horne wrote:
> Previously when fixing PR 21464 we masked out upper bits of the
> relocation value in order to avoid overflow complaints when acceptable.
> It turns out this does not work when the relocation value ends up being
> signed.
>
> To fix this this patch introduces a special howto with
> complain_on_overflow set to complain_overflow_dont. This is used in
> place of the normal R_OR1K_GOT16 howto when we detect R_OR1K_GOT_AHI16
> relocations.
>
> bfd/ChangeLog:
>
> PR 28735
> * elf32-or1k.c (or1k_elf_got16_no_overflow_howto): Define.
> (or1k_elf_relocate_section): Use new howto instead of trying to
> mask out relocation bits.
> ---
> bfd/elf32-or1k.c | 24 ++++++++++++++++++++----
> 1 file changed, 20 insertions(+), 4 deletions(-)
>
> diff --git a/bfd/elf32-or1k.c b/bfd/elf32-or1k.c
> index 4f9092539f5..a2ff47473a7 100644
> --- a/bfd/elf32-or1k.c
> +++ b/bfd/elf32-or1k.c
> @@ -828,6 +828,23 @@ static reloc_howto_type or1k_elf_howto_table[] =
> false), /* pcrel_offset */
> };
>
> +/* A copy of the R_OR1K_GOT16 used in the presense of R_OR1K_GOT_AHI16
> + relocations when we know we can ignore overflows. */
> +static reloc_howto_type or1k_elf_got16_no_overflow_howto =
> + HOWTO (R_OR1K_GOT16, /* type */
> + 0, /* rightshift */
> + 2, /* size (0 = byte, 1 = short, 2 = long) */
> + 16, /* bitsize */
> + false, /* pc_relative */
> + 0, /* bitpos */
> + complain_overflow_dont, /* complain_on_overflow */
> + bfd_elf_generic_reloc, /* special_function */
> + "R_OR1K_GOT16", /* name */
> + false, /* partial_inplace */
> + 0, /* src_mask */
> + 0xffff, /* dst_mask */
> + false); /* pcrel_offset */
> +
> /* Map BFD reloc types to Or1k ELF reloc types. */
>
> struct or1k_reloc_map
> @@ -1506,12 +1523,11 @@ or1k_elf_relocate_section (bfd *output_bfd,
> if (r_type == R_OR1K_GOT_AHI16)
> saw_gotha = true;
>
> - /* If we have a R_OR1K_GOT16 followed by a R_OR1K_GOT_AHI16
> + /* If we have a R_OR1K_GOT16 following a R_OR1K_GOT_AHI16
> relocation we assume the code is doing the right thing to avoid
> - overflows. Here we mask the lower 16-bit of the relocation to
> - avoid overflow validation failures. */
> + overflows. */
> if (r_type == R_OR1K_GOT16 && saw_gotha)
> - relocation &= 0xffff;
> + howto = &or1k_elf_got16_no_overflow_howto;
>
> /* Addend should be zero. */
> if (rel->r_addend != 0)
>
this patch fixes the problem.
Thanks a lot
Best regards
--
Giulio Benetti
Benetti Engineering sas
More information about the Binutils
mailing list