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: