if (use_plt_got
&& h != NULL
&& h->plt.refcount > 0
- && h->got.refcount > 0
+ && (((info->flags & DF_BIND_NOW) && !h->pointer_equality_needed)
+ || h->got.refcount > 0)
&& htab->plt_got == NULL)
{
/* Create the GOT procedure linkage table. */
else if (htab->elf.dynamic_sections_created
&& (h->plt.refcount > 0 || eh->plt_got.refcount > 0))
{
- bfd_boolean use_plt_got = eh->plt_got.refcount > 0;
+ bfd_boolean use_plt_got;
+
+ if ((info->flags & DF_BIND_NOW) && !h->pointer_equality_needed)
+ {
+ /* Don't use the regular PLT for DF_BIND_NOW. */
+ h->plt.offset = (bfd_vma) -1;
+
+ /* Use the GOT PLT. */
+ h->got.refcount = 1;
+ eh->plt_got.refcount = 1;
+ }
+
+ use_plt_got = eh->plt_got.refcount > 0;
/* Make sure this symbol is output as a dynamic symbol.
Undefined weak syms won't yet be marked as dynamic. */
else
plt_sym_val[reloc_index] = plt->vma + plt_offset;
plt_offset += bed->plt_entry_size;
+
+ /* PR binutils/18437: Skip extra relocations in the .rela.plt
+ section. */
+ if (plt_offset >= plt->size)
+ break;
}
free (plt_contents);