* elf32-cris.c (cris_elf_gc_sweep_hook) <R_CRIS_16_GOTPLT>

<R_CRIS_32_GOTPLT>: Fix missing update of gotplt refcount for
	global symbols.
	<R_CRIS_8, R_CRIS_16, R_CRIS_32>: New cases for similar missing
	updates of the plt refcount.
	(elf_cris_adjust_gotplt_to_got): Assert integrity of the gotplt
	refcount in relation to the plt refcount.
This commit is contained in:
Hans-Peter Nilsson 2011-10-14 06:52:46 +00:00
parent 357f012bf4
commit 970d488d05
2 changed files with 22 additions and 0 deletions

View File

@ -1,3 +1,13 @@
2011-10-14 Hans-Peter Nilsson <hp@axis.com>
* elf32-cris.c (cris_elf_gc_sweep_hook) <R_CRIS_16_GOTPLT>
<R_CRIS_32_GOTPLT>: Fix missing update of gotplt refcount for
global symbols.
<R_CRIS_8, R_CRIS_16, R_CRIS_32>: New cases for similar missing
updates of the plt refcount.
(elf_cris_adjust_gotplt_to_got): Assert integrity of the gotplt
refcount in relation to the plt refcount.
2011-10-13 Richard Sandiford <richard.sandiford@linaro.org>
* elf32-arm.c (elf32_arm_final_link_relocate): Mark PLT calls via

View File

@ -2663,6 +2663,9 @@ cris_elf_gc_sweep_hook (bfd *abfd,
/* For local symbols, treat these like GOT relocs. */
if (h == NULL)
goto local_got_reloc;
else
/* For global symbols, adjust the reloc-specific refcount. */
elf_cris_hash_entry (h)->gotplt_refcount--;
/* Fall through. */
case R_CRIS_32_PLT_GOTREL:
@ -2671,10 +2674,14 @@ cris_elf_gc_sweep_hook (bfd *abfd,
local_got_refcounts[-1]--;
/* Fall through. */
case R_CRIS_8:
case R_CRIS_16:
case R_CRIS_32:
case R_CRIS_8_PCREL:
case R_CRIS_16_PCREL:
case R_CRIS_32_PCREL:
case R_CRIS_32_PLT_PCREL:
/* Negate the increment we did in cris_elf_check_relocs. */
if (h != NULL)
{
if (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
@ -2733,6 +2740,11 @@ elf_cris_adjust_gotplt_to_got (h, 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. */
BFD_ASSERT (h->gotplt_refcount == 0
|| h->gotplt_refcount <= h->root.plt.refcount);
/* If nobody wanted a GOTPLT with this symbol, we're done. */
if (h->gotplt_refcount <= 0)
return TRUE;