/* IBM S/390-specific support for ELF 32 and 64 bit functions
- Copyright (C) 2000-2015 Free Software Foundation, Inc.
+ Copyright (C) 2000-2016 Free Software Foundation, Inc.
Contributed by Andreas Krebbel.
This file is part of BFD, the Binary File Descriptor library.
flags = bed->dynamic_sec_flags;
- if (info->shared)
+ if (bfd_link_pic (info))
{
s = bfd_make_section_with_flags (abfd, ".rela.ifunc",
flags | SEC_READONLY);
static bfd_boolean
s390_elf_allocate_ifunc_dyn_relocs (struct bfd_link_info *info,
- struct elf_link_hash_entry *h,
- struct elf_dyn_relocs **head)
+ struct elf_link_hash_entry *h)
{
struct elf_dyn_relocs *p;
struct elf_link_hash_table *htab;
struct elf_s390_link_hash_entry *eh = (struct elf_s390_link_hash_entry*)h;
+ struct elf_dyn_relocs **head = &eh->dyn_relocs;
htab = elf_hash_table (info);
eh->ifunc_resolver_address = h->root.u.def.value;
where it is marked with regular reference, but not non-GOT
reference. It may happen if we didn't see STT_GNU_IFUNC
symbol at the time when checking relocations. */
- if (info->shared
+ if (bfd_link_pic (info)
&& !h->non_got_ref
&& h->ref_regular)
for (p = *head; p != NULL; p = p->next)
point to the IPLT slot. That way the referencing shared lib will
always get the PLT slot address when resolving the respective
R_390_GLOB_DAT/R_390_64 relocs on that symbol. */
- if (info->executable && !info->shared && h->def_regular && h->ref_dynamic)
+ if (bfd_link_pde (info)
+ && h->def_regular
+ && h->ref_dynamic)
{
h->root.u.def.section = htab->iplt;
h->root.u.def.value = h->plt.offset;
/* We need dynamic relocation for STT_GNU_IFUNC symbol only when
there is a non-GOT reference in a shared object. */
- if (!info->shared || !h->non_got_ref)
+ if (!bfd_link_pic (info) || !h->non_got_ref)
*head = NULL;
/* Finally, allocate space. */
avoided if the values in the GOT slots could differ for pointer
equality reasons. */
if (h->got.refcount <= 0
- || (info->shared
+ || (bfd_link_pic (info)
&& (h->dynindx == -1 || h->forced_local))
- || (info->executable && info->shared)
+ || bfd_link_pie (info)
|| htab->sgot == NULL)
{
/* Use .got.iplt. */
{
h->got.offset = htab->sgot->size;
htab->sgot->size += GOT_ENTRY_SIZE;
- if (info->shared)
+ if (bfd_link_pic (info))
htab->srelgot->size += RELA_ENTRY_SIZE;
}