diff options
Diffstat (limited to 'bfd/elf32-i386.c')
-rw-r--r-- | bfd/elf32-i386.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index 815473d..c6ff746 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -1885,7 +1885,7 @@ do_size: if (use_plt_got && h != NULL && h->plt.refcount > 0 - && h->got.refcount > 0 + && ((info->flags & DF_BIND_NOW) || h->got.refcount > 0) && htab->plt_got == NULL) { /* Create the GOT procedure linkage table. */ @@ -2321,7 +2321,19 @@ elf_i386_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) 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)) + { + /* 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. */ |