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