summaryrefslogtreecommitdiff
path: root/toolchain/binutils/patches/2.28/cris-pr16044.patch
blob: f219623dccff6095590f8adc80890bf9dfe25359 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
diff -Nur binutils-2.28.orig/bfd/elf32-cris.c binutils-2.28/bfd/elf32-cris.c
--- binutils-2.28.orig/bfd/elf32-cris.c	2017-03-02 09:23:53.000000000 +0100
+++ binutils-2.28/bfd/elf32-cris.c	2017-03-29 04:09:00.227801746 +0200
@@ -2714,8 +2714,9 @@
   struct bfd_link_info *info = (struct bfd_link_info *) p;
 
   /* A GOTPLT reloc, when activated, is supposed to be included into
-     the PLT refcount.  */
+     the PLT refcount, when the symbol isn't set-or-forced local.  */
   BFD_ASSERT (h->gotplt_refcount == 0
+	      || h->root.plt.refcount == -1
 	      || h->gotplt_refcount <= h->root.plt.refcount);
 
   /* If nobody wanted a GOTPLT with this symbol, we're done.  */
@@ -2741,6 +2742,7 @@
       srelgot = elf_hash_table (info)->srelgot;
 
       /* Put accurate refcounts there.  */
+      BFD_ASSERT (h->root.got.refcount >= 0);
       h->root.got.refcount += h->gotplt_refcount;
       h->reg_got_refcount = h->gotplt_refcount;
 
@@ -3476,7 +3478,9 @@
 	    continue;
 
 	  h->needs_plt = 1;
-	  h->plt.refcount++;
+          /* If the symbol is forced local, the refcount is unavailable.  */
+          if (h->plt.refcount != -1)
+	    h->plt.refcount++;
 	  break;
 
 	case R_CRIS_8: