From: Alan Modra Date: Mon, 31 Mar 2025 08:49:28 +0000 (+1030) Subject: ubsan: nds32 undefined shift X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7bc46c997839cbcb02f987f4cbf776b7a3bcc6f8;p=thirdparty%2Fbinutils-gdb.git ubsan: nds32 undefined shift Avoid implementation defined behaviour right shift of negative values, and undefined behaviour left shift of negative values. While this change might give different results in the top bit of a bfd_vma (rightshift is 1), that doesn't matter as only the bottom 8 bits of the relocation are used. * elf32-nds32.c (nds32_elf_do_9_pcrel_reloc): Calculate relocation using a bfd_vma type. --- diff --git a/bfd/elf32-nds32.c b/bfd/elf32-nds32.c index e240c311841..1aff60a2505 100644 --- a/bfd/elf32-nds32.c +++ b/bfd/elf32-nds32.c @@ -2692,7 +2692,7 @@ nds32_elf_do_9_pcrel_reloc (bfd * abfd, bfd_vma symbol_value, bfd_vma addend) { - bfd_signed_vma relocation; + bfd_vma relocation; unsigned short x; bfd_reloc_status_type status; @@ -2708,7 +2708,7 @@ nds32_elf_do_9_pcrel_reloc (bfd * abfd, before doing pcrel calculations. */ relocation -= (offset & -(bfd_vma) 2); - if (relocation < -ACCURATE_8BIT_S1 || relocation >= ACCURATE_8BIT_S1) + if (relocation + ACCURATE_8BIT_S1 >= 2 * ACCURATE_8BIT_S1) status = bfd_reloc_overflow; else status = bfd_reloc_ok;