1*4882a593SmuzhiyunFrom 362a20108782b87cd780a989c0dbd014fc2def8b Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Stafford Horne <shorne@gmail.com> 3*4882a593SmuzhiyunDate: Sun, 2 Jan 2022 09:03:28 +0900 4*4882a593SmuzhiyunSubject: [PATCH] or1k: Avoid R_OR1K_GOT16 signed overflow by using special 5*4882a593Smuzhiyun howto 6*4882a593Smuzhiyun 7*4882a593SmuzhiyunPreviously when fixing PR 21464 we masked out upper bits of the 8*4882a593Smuzhiyunrelocation value in order to avoid overflow complaints when acceptable. 9*4882a593SmuzhiyunIt turns out this does not work when the relocation value ends up being 10*4882a593Smuzhiyunsigned. 11*4882a593Smuzhiyun 12*4882a593SmuzhiyunTo fix this this patch introduces a special howto with 13*4882a593Smuzhiyuncomplain_on_overflow set to complain_overflow_dont. This is used in 14*4882a593Smuzhiyunplace of the normal R_OR1K_GOT16 howto when we detect R_OR1K_GOT_AHI16 15*4882a593Smuzhiyunrelocations. 16*4882a593Smuzhiyun 17*4882a593Smuzhiyunbfd/ChangeLog: 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun PR 28735 20*4882a593Smuzhiyun * elf32-or1k.c (or1k_elf_got16_no_overflow_howto): Define. 21*4882a593Smuzhiyun (or1k_elf_relocate_section): Use new howto instead of trying to 22*4882a593Smuzhiyun mask out relocation bits. 23*4882a593Smuzhiyun 24*4882a593SmuzhiyunSigned-off-by: Giulio Benetti <giulio.benetti@benettiengineering.com> 25*4882a593Smuzhiyun--- 26*4882a593Smuzhiyun bfd/elf32-or1k.c | 24 ++++++++++++++++++++---- 27*4882a593Smuzhiyun 1 file changed, 20 insertions(+), 4 deletions(-) 28*4882a593Smuzhiyun 29*4882a593Smuzhiyundiff --git a/bfd/elf32-or1k.c b/bfd/elf32-or1k.c 30*4882a593Smuzhiyunindex 4ae7f324d33..7fd88d72442 100644 31*4882a593Smuzhiyun--- a/bfd/elf32-or1k.c 32*4882a593Smuzhiyun+++ b/bfd/elf32-or1k.c 33*4882a593Smuzhiyun@@ -828,6 +828,23 @@ static reloc_howto_type or1k_elf_howto_table[] = 34*4882a593Smuzhiyun false), /* pcrel_offset */ 35*4882a593Smuzhiyun }; 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun+/* A copy of the R_OR1K_GOT16 used in the presense of R_OR1K_GOT_AHI16 38*4882a593Smuzhiyun+ relocations when we know we can ignore overflows. */ 39*4882a593Smuzhiyun+static reloc_howto_type or1k_elf_got16_no_overflow_howto = 40*4882a593Smuzhiyun+ HOWTO (R_OR1K_GOT16, /* type */ 41*4882a593Smuzhiyun+ 0, /* rightshift */ 42*4882a593Smuzhiyun+ 2, /* size (0 = byte, 1 = short, 2 = long) */ 43*4882a593Smuzhiyun+ 16, /* bitsize */ 44*4882a593Smuzhiyun+ false, /* pc_relative */ 45*4882a593Smuzhiyun+ 0, /* bitpos */ 46*4882a593Smuzhiyun+ complain_overflow_dont, /* complain_on_overflow */ 47*4882a593Smuzhiyun+ bfd_elf_generic_reloc, /* special_function */ 48*4882a593Smuzhiyun+ "R_OR1K_GOT16", /* name */ 49*4882a593Smuzhiyun+ false, /* partial_inplace */ 50*4882a593Smuzhiyun+ 0, /* src_mask */ 51*4882a593Smuzhiyun+ 0xffff, /* dst_mask */ 52*4882a593Smuzhiyun+ false); /* pcrel_offset */ 53*4882a593Smuzhiyun+ 54*4882a593Smuzhiyun /* Map BFD reloc types to Or1k ELF reloc types. */ 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun struct or1k_reloc_map 57*4882a593Smuzhiyun@@ -1506,12 +1523,11 @@ or1k_elf_relocate_section (bfd *output_bfd, 58*4882a593Smuzhiyun if (r_type == R_OR1K_GOT_AHI16) 59*4882a593Smuzhiyun saw_gotha = true; 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun- /* If we have a R_OR1K_GOT16 followed by a R_OR1K_GOT_AHI16 62*4882a593Smuzhiyun+ /* If we have a R_OR1K_GOT16 following a R_OR1K_GOT_AHI16 63*4882a593Smuzhiyun relocation we assume the code is doing the right thing to avoid 64*4882a593Smuzhiyun- overflows. Here we mask the lower 16-bit of the relocation to 65*4882a593Smuzhiyun- avoid overflow validation failures. */ 66*4882a593Smuzhiyun+ overflows. */ 67*4882a593Smuzhiyun if (r_type == R_OR1K_GOT16 && saw_gotha) 68*4882a593Smuzhiyun- relocation &= 0xffff; 69*4882a593Smuzhiyun+ howto = &or1k_elf_got16_no_overflow_howto; 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun /* Addend should be zero. */ 72*4882a593Smuzhiyun if (rel->r_addend != 0) 73*4882a593Smuzhiyun-- 74*4882a593Smuzhiyun2.25.1 75*4882a593Smuzhiyun 76