diff options
author | Hans-Peter Nilsson <hp@bitrange.com> | 2017-03-28 23:43:09 +0200 |
---|---|---|
committer | Hans-Peter Nilsson <hp@bitrange.com> | 2017-03-28 23:43:09 +0200 |
commit | 086554e8e6b222518f12acab34e6cc7b5af7fde7 (patch) | |
tree | 2659c075142a0cdf2d7daf584d94e2fdea462403 /bfd/elf32-cris.c | |
parent | fe5f7374bef8f23ffa0fe0dee0f9b05e0a218a29 (diff) | |
download | binutils-gdb-086554e8e6b222518f12acab34e6cc7b5af7fde7.tar.gz |
Fix for PR ld/16044: elf32-cris.c h->plt.refcount inconsistency
Diffstat (limited to 'bfd/elf32-cris.c')
-rw-r--r-- | bfd/elf32-cris.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/bfd/elf32-cris.c b/bfd/elf32-cris.c index 97b8cc3eb85..d4bbcebecc6 100644 --- a/bfd/elf32-cris.c +++ b/bfd/elf32-cris.c @@ -2714,8 +2714,9 @@ elf_cris_adjust_gotplt_to_got (struct elf_cris_link_hash_entry *h, void * p) 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 @@ elf_cris_adjust_gotplt_to_got (struct elf_cris_link_hash_entry *h, void * p) 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,10 @@ cris_elf_check_relocs (bfd *abfd, 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: |