/* IBM S/390-specific support for ELF 32 and 64 bit functions
- Copyright (C) 2000-2015 Free Software Foundation, Inc.
+ Copyright (C) 2000-2017 Free Software Foundation, Inc.
Contributed by Andreas Krebbel.
This file is part of BFD, the Binary File Descriptor library.
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;
h->type = STT_FUNC;
}
- /* We need dynamic relocation for STT_GNU_IFUNC symbol only when
- there is a non-GOT reference in a shared object. */
- if (!bfd_link_pic (info) || !h->non_got_ref)
+ if (!bfd_link_pic (info))
*head = NULL;
/* Finally, allocate space. */
asection **secp ATTRIBUTE_UNUSED,
bfd_vma *valp ATTRIBUTE_UNUSED)
{
- if ((ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC
- || ELF_ST_BIND (sym->st_info) == STB_GNU_UNIQUE)
+ if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC
&& (abfd->flags & DYNAMIC) == 0
&& bfd_get_flavour (info->output_bfd) == bfd_target_elf_flavour)
- elf_tdata (info->output_bfd)->has_gnu_symbols = elf_gnu_symbol_any;
+ elf_tdata (info->output_bfd)->has_gnu_symbols |= elf_gnu_symbol_ifunc;
return TRUE;
}
/* Merge object attributes from IBFD into OBFD. Raise an error if
there are conflicting attributes. */
static bfd_boolean
-elf_s390_merge_obj_attributes (bfd *ibfd, bfd *obfd)
+elf_s390_merge_obj_attributes (bfd *ibfd, struct bfd_link_info *info)
{
+ bfd *obfd = info->output_bfd;
obj_attribute *in_attr, *in_attrs;
obj_attribute *out_attr, *out_attrs;
if (in_attr->i > 2)
_bfd_error_handler
+ /* xgettext:c-format */
(_("Warning: %B uses unknown vector ABI %d"), ibfd,
in_attr->i);
else if (out_attr->i > 2)
_bfd_error_handler
+ /* xgettext:c-format */
(_("Warning: %B uses unknown vector ABI %d"), obfd,
out_attr->i);
else if (in_attr->i != out_attr->i)
const char abi_str[3][9] = { "none", "software", "hardware" };
_bfd_error_handler
+ /* xgettext:c-format */
(_("Warning: %B uses vector %s ABI, %B uses %s ABI"),
- ibfd, obfd, abi_str[in_attr->i], abi_str[out_attr->i]);
+ ibfd, abi_str[in_attr->i], obfd, abi_str[out_attr->i]);
}
if (in_attr->i > out_attr->i)
out_attr->i = in_attr->i;
}
/* Merge Tag_compatibility attributes and any common GNU ones. */
- _bfd_elf_merge_object_attributes (ibfd, obfd);
+ _bfd_elf_merge_object_attributes (ibfd, info);
return TRUE;
}