symbol. */
struct elf32_hppa_stub_hash_entry *hsh_cache;
- /* Used to count relocations for delayed sizing of relocation
- sections. */
- struct elf_dyn_relocs *dyn_relocs;
-
ENUM_BITFIELD (_tls_type) tls_type : 8;
/* Set if this symbol is used by a plabel reloc. */
/* Initialize the local fields. */
hh = hppa_elf_hash_entry (entry);
hh->hsh_cache = NULL;
- hh->dyn_relocs = NULL;
hh->plabel = 0;
hh->tls_type = GOT_UNKNOWN;
}
hh_dir = hppa_elf_hash_entry (eh_dir);
hh_ind = hppa_elf_hash_entry (eh_ind);
- if (hh_ind->dyn_relocs != NULL
- && eh_ind->root.type == bfd_link_hash_indirect)
- {
- if (hh_dir->dyn_relocs != NULL)
- {
- struct elf_dyn_relocs **hdh_pp;
- struct elf_dyn_relocs *hdh_p;
-
- /* Add reloc counts against the indirect sym to the direct sym
- list. Merge any entries against the same section. */
- for (hdh_pp = &hh_ind->dyn_relocs; (hdh_p = *hdh_pp) != NULL; )
- {
- struct elf_dyn_relocs *hdh_q;
-
- for (hdh_q = hh_dir->dyn_relocs;
- hdh_q != NULL;
- hdh_q = hdh_q->next)
- if (hdh_q->sec == hdh_p->sec)
- {
-#if RELATIVE_DYNRELOCS
- hdh_q->pc_count += hdh_p->pc_count;
-#endif
- hdh_q->count += hdh_p->count;
- *hdh_pp = hdh_p->next;
- break;
- }
- if (hdh_q == NULL)
- hdh_pp = &hdh_p->next;
- }
- *hdh_pp = hh_dir->dyn_relocs;
- }
-
- hh_dir->dyn_relocs = hh_ind->dyn_relocs;
- hh_ind->dyn_relocs = NULL;
- }
-
if (eh_ind->root.type == bfd_link_hash_indirect)
{
hh_dir->plabel |= hh_ind->plabel;
relocations we need for this symbol. */
if (hh != NULL)
{
- hdh_head = &hh->dyn_relocs;
+ hdh_head = &hh->eh.dyn_relocs;
}
else
{
}
}
-/* Find any dynamic relocs that apply to read-only sections. */
-
-static asection *
-readonly_dynrelocs (struct elf_link_hash_entry *eh)
-{
- struct elf32_hppa_link_hash_entry *hh;
- struct elf_dyn_relocs *hdh_p;
-
- hh = hppa_elf_hash_entry (eh);
- for (hdh_p = hh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->next)
- {
- asection *sec = hdh_p->sec->output_section;
-
- if (sec != NULL && (sec->flags & SEC_READONLY) != 0)
- return hdh_p->sec;
- }
- return NULL;
-}
-
/* Return true if we have dynamic relocs against H or any of its weak
aliases, that apply to read-only sections. Cannot be used after
size_dynamic_sections. */
struct elf32_hppa_link_hash_entry *hh = hppa_elf_hash_entry (eh);
do
{
- if (readonly_dynrelocs (&hh->eh))
+ if (_bfd_elf_readonly_dynrelocs (&hh->eh))
return TRUE;
hh = hppa_elf_hash_entry (hh->eh.u.alias);
} while (hh != NULL && &hh->eh != eh);
/* Discard dyn_relocs when non-pic if we've decided that a
function symbol is local. */
if (!bfd_link_pic (info) && local)
- hppa_elf_hash_entry (eh)->dyn_relocs = NULL;
+ eh->dyn_relocs = NULL;
/* If the symbol is used by a plabel, we must allocate a PLT slot.
The refcounts are not reliable when it has been hidden since
eh->root.u.def.value = def->root.u.def.value;
if (def->root.u.def.section == htab->etab.sdynbss
|| def->root.u.def.section == htab->etab.sdynrelro)
- hppa_elf_hash_entry (eh)->dyn_relocs = NULL;
+ eh->dyn_relocs = NULL;
return TRUE;
}
}
/* We no longer want dyn_relocs. */
- hppa_elf_hash_entry (eh)->dyn_relocs = NULL;
+ eh->dyn_relocs = NULL;
return _bfd_elf_adjust_dynamic_copy (info, eh, sec);
}
/* If no dynamic sections we can't have dynamic relocs. */
if (!htab->etab.dynamic_sections_created)
- hh->dyn_relocs = NULL;
+ eh->dyn_relocs = NULL;
/* Discard relocs on undefined syms with non-default visibility. */
else if ((eh->root.type == bfd_link_hash_undefined
&& ELF_ST_VISIBILITY (eh->other) != STV_DEFAULT)
|| UNDEFWEAK_NO_DYNAMIC_RELOC (info, eh))
- hh->dyn_relocs = NULL;
+ eh->dyn_relocs = NULL;
- if (hh->dyn_relocs == NULL)
+ if (eh->dyn_relocs == NULL)
return TRUE;
/* If this is a -Bsymbolic shared link, then we need to discard all
{
struct elf_dyn_relocs **hdh_pp;
- for (hdh_pp = &hh->dyn_relocs; (hdh_p = *hdh_pp) != NULL; )
+ for (hdh_pp = &eh->dyn_relocs; (hdh_p = *hdh_pp) != NULL; )
{
hdh_p->count -= hdh_p->pc_count;
hdh_p->pc_count = 0;
}
#endif
- if (hh->dyn_relocs != NULL)
+ if (eh->dyn_relocs != NULL)
{
if (!ensure_undef_dynamic (info, eh))
return FALSE;
return FALSE;
if (eh->dynindx == -1)
- hh->dyn_relocs = NULL;
+ eh->dyn_relocs = NULL;
}
else
- hh->dyn_relocs = NULL;
+ eh->dyn_relocs = NULL;
}
/* Finally, allocate space. */
- for (hdh_p = hh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->next)
+ for (hdh_p = eh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->next)
{
asection *sreloc = elf_section_data (hdh_p->sec)->sreloc;
sreloc->size += hdh_p->count * sizeof (Elf32_External_Rela);
return TRUE;
}
-/* Set DF_TEXTREL if we find any dynamic relocs that apply to
- read-only sections. */
-
-static bfd_boolean
-maybe_set_textrel (struct elf_link_hash_entry *eh, void *inf)
-{
- asection *sec;
-
- if (eh->root.type == bfd_link_hash_indirect)
- return TRUE;
-
- sec = readonly_dynrelocs (eh);
- if (sec != NULL)
- {
- struct bfd_link_info *info = (struct bfd_link_info *) inf;
-
- info->flags |= DF_TEXTREL;
- info->callbacks->minfo
- (_("%pB: dynamic relocation against `%pT' in read-only section `%pA'\n"),
- sec->owner, eh->root.root.string, sec);
-
- /* Not an error, just cut short the traversal. */
- return FALSE;
- }
- return TRUE;
-}
-
/* Set the sizes of the dynamic sections. */
static bfd_boolean
/* If any dynamic relocs apply to a read-only section,
then we need a DT_TEXTREL entry. */
if ((info->flags & DF_TEXTREL) == 0)
- elf_link_hash_traverse (&htab->etab, maybe_set_textrel, info);
+ elf_link_hash_traverse (&htab->etab,
+ _bfd_elf_maybe_set_textrel, info);
if ((info->flags & DF_TEXTREL) != 0)
{
if (bfd_link_pic (info)
? ((hh == NULL
- || hh->dyn_relocs != NULL)
+ || hh->eh.dyn_relocs != NULL)
&& ((hh != NULL && pc_dynrelocs (hh))
|| IS_ABSOLUTE_RELOC (r_type)))
: (hh != NULL
- && hh->dyn_relocs != NULL))
+ && hh->eh.dyn_relocs != NULL))
{
Elf_Internal_Rela outrel;
bfd_boolean skip;