2003-05-04 H.J. Lu <hjl@gnu.org>

* elflink.h (elf_merge_symbol): Don't record a hidden/internal
	symbol dynamic. Check indirection when removing the old
	definition for symbols with non-default visibility.
	(elf_add_default_symbol): Skip when told by elf_merge_symbol.
This commit is contained in:
H.J. Lu
2003-05-05 00:37:02 +00:00
parent 0ce3d317be
commit d31e3dfee9
2 changed files with 28 additions and 4 deletions

View File

@ -1,3 +1,10 @@
2003-05-04 H.J. Lu <hjl@gnu.org>
* elflink.h (elf_merge_symbol): Don't record a hidden/internal
symbol dynamic. Check indirection when removing the old
definition for symbols with non-default visibility.
(elf_add_default_symbol): Skip when told by elf_merge_symbol.
2003-05-02 Nick Clifton <nickc@redhat.com> 2003-05-02 Nick Clifton <nickc@redhat.com>
* elf32-xstormy16.c (xstormy16_elf_howto_table): Make the * elf32-xstormy16.c (xstormy16_elf_howto_table): Make the

View File

@ -639,8 +639,14 @@ elf_merge_symbol (abfd, info, name, sym, psec, pvalue, sym_hash, skip,
*skip = TRUE; *skip = TRUE;
/* Make sure this symbol is dynamic. */ /* Make sure this symbol is dynamic. */
h->elf_link_hash_flags |= ELF_LINK_HASH_REF_DYNAMIC; h->elf_link_hash_flags |= ELF_LINK_HASH_REF_DYNAMIC;
/* FIXME: Should we check type and size for protected symbol? */ /* A protected symbol has external availability. Make sure it is
return _bfd_elf_link_record_dynamic_symbol (info, h); recorded as dynamic.
FIXME: Should we check type and size for protected symbol? */
if (ELF_ST_VISIBILITY (h->other) == STV_PROTECTED)
return _bfd_elf_link_record_dynamic_symbol (info, h);
else
return TRUE;
} }
else if (!newdyn else if (!newdyn
&& ELF_ST_VISIBILITY (sym->st_other) && ELF_ST_VISIBILITY (sym->st_other)
@ -649,10 +655,15 @@ elf_merge_symbol (abfd, info, name, sym, psec, pvalue, sym_hash, skip,
/* If the new symbol with non-default visibility comes from a /* If the new symbol with non-default visibility comes from a
relocatable file and the old definition comes from a dynamic relocatable file and the old definition comes from a dynamic
object, we remove the old definition. */ object, we remove the old definition. */
if ((*sym_hash)->root.type == bfd_link_hash_indirect)
h = *sym_hash;
h->root.type = bfd_link_hash_new; h->root.type = bfd_link_hash_new;
h->root.u.undef.abfd = NULL; h->root.u.undef.abfd = NULL;
h->elf_link_hash_flags &= ~ELF_LINK_HASH_DEF_DYNAMIC; if (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC)
h->elf_link_hash_flags |= ELF_LINK_HASH_REF_DYNAMIC; {
h->elf_link_hash_flags &= ~ELF_LINK_HASH_DEF_DYNAMIC;
h->elf_link_hash_flags |= ELF_LINK_HASH_REF_DYNAMIC;
}
/* FIXME: Should we check type and size for protected symbol? */ /* FIXME: Should we check type and size for protected symbol? */
h->size = 0; h->size = 0;
h->type = 0; h->type = 0;
@ -1049,6 +1060,9 @@ elf_add_default_symbol (abfd, info, h, name, sym, psec, value,
&size_change_ok, dt_needed)) &size_change_ok, dt_needed))
return FALSE; return FALSE;
if (skip)
return TRUE;
if (! override) if (! override)
{ {
bh = &hi->root; bh = &hi->root;
@ -1158,6 +1172,9 @@ elf_add_default_symbol (abfd, info, h, name, sym, psec, value,
&size_change_ok, dt_needed)) &size_change_ok, dt_needed))
return FALSE; return FALSE;
if (skip)
return TRUE;
if (override) if (override)
{ {
/* Here SHORTNAME is a versioned name, so we don't expect to see /* Here SHORTNAME is a versioned name, so we don't expect to see