* elflink.c (_bfd_elf_merge_symbol): Also override the version

a dynamic symbol defaulted to if preempted with a hidden or
	internal definition.
This commit is contained in:
Maciej W. Rozycki 2012-08-28 20:13:27 +00:00
parent 18c1b81abe
commit aed81c4e9c
2 changed files with 22 additions and 14 deletions

View file

@ -1,3 +1,9 @@
2012-08-28 Maciej W. Rozycki <macro@codesourcery.com>
* elflink.c (_bfd_elf_merge_symbol): Also override the version
a dynamic symbol defaulted to if preempted with a hidden or
internal definition.
2012-08-28 Walter Lee <walt@tilera.com>
* elf32-tilepro.c (allocate_dynrelocs): Use PLT_ENTRY_SIZE as size

View file

@ -1210,23 +1210,25 @@ _bfd_elf_merge_symbol (bfd *abfd,
vh->root.type = h->root.type;
h->root.type = bfd_link_hash_indirect;
(*bed->elf_backend_copy_indirect_symbol) (info, vh, h);
/* Protected symbols will override the dynamic definition
with default version. */
if (ELF_ST_VISIBILITY (sym->st_other) == STV_PROTECTED)
h->root.u.i.link = (struct bfd_link_hash_entry *) vh;
if (ELF_ST_VISIBILITY (sym->st_other) != STV_PROTECTED)
{
h->root.u.i.link = (struct bfd_link_hash_entry *) vh;
vh->dynamic_def = 1;
vh->ref_dynamic = 1;
/* If the new symbol is hidden or internal, completely undo
any dynamic link state. */
(*bed->elf_backend_hide_symbol) (info, h, TRUE);
h->forced_local = 0;
h->ref_dynamic = 0;
}
else
{
h->root.type = vh->root.type;
vh->ref_dynamic = 0;
/* We have to hide it here since it was made dynamic
global with extra bits when the symbol info was
copied from the old dynamic definition. */
(*bed->elf_backend_hide_symbol) (info, vh, TRUE);
}
h->ref_dynamic = 1;
h->def_dynamic = 0;
h->dynamic_def = 0;
/* FIXME: Should we check type and size for protected symbol? */
h->size = 0;
h->type = 0;
h = vh;
}
else