* elflink.c (_bfd_elf_merge_symbol): Set *poldbfd, *poldweak,
and *poldalignment before exiting when !relocs_compatible.
This commit is contained in:
parent
00b7642b8a
commit
934bce08d2
|
@ -1,3 +1,8 @@
|
|||
2013-08-21 Alan Modra <amodra@gmail.com>
|
||||
|
||||
* elflink.c (_bfd_elf_merge_symbol): Set *poldbfd, *poldweak,
|
||||
and *poldalignment before exiting when !relocs_compatible.
|
||||
|
||||
2013-08-21 Alan Modra <amodra@gmail.com>
|
||||
|
||||
* elflink.c (_bfd_elf_define_linkage_sym): Don't set STV_INTERNAL
|
||||
|
|
|
@ -951,11 +951,6 @@ _bfd_elf_merge_symbol (bfd *abfd,
|
|||
|
||||
bed = get_elf_backend_data (abfd);
|
||||
|
||||
/* This code is for coping with dynamic objects, and is only useful
|
||||
if we are doing an ELF link. */
|
||||
if (!(*bed->relocs_compatible) (abfd->xvec, info->output_bfd->xvec))
|
||||
return TRUE;
|
||||
|
||||
/* For merging, we only care about real symbols. But we need to make
|
||||
sure that indirect symbol dynamic flags are updated. */
|
||||
hi = h;
|
||||
|
@ -963,6 +958,49 @@ _bfd_elf_merge_symbol (bfd *abfd,
|
|||
|| h->root.type == bfd_link_hash_warning)
|
||||
h = (struct elf_link_hash_entry *) h->root.u.i.link;
|
||||
|
||||
/* OLDBFD and OLDSEC are a BFD and an ASECTION associated with the
|
||||
existing symbol. */
|
||||
|
||||
oldbfd = NULL;
|
||||
oldsec = NULL;
|
||||
switch (h->root.type)
|
||||
{
|
||||
default:
|
||||
break;
|
||||
|
||||
case bfd_link_hash_undefined:
|
||||
case bfd_link_hash_undefweak:
|
||||
oldbfd = h->root.u.undef.abfd;
|
||||
break;
|
||||
|
||||
case bfd_link_hash_defined:
|
||||
case bfd_link_hash_defweak:
|
||||
oldbfd = h->root.u.def.section->owner;
|
||||
oldsec = h->root.u.def.section;
|
||||
break;
|
||||
|
||||
case bfd_link_hash_common:
|
||||
oldbfd = h->root.u.c.p->section->owner;
|
||||
oldsec = h->root.u.c.p->section;
|
||||
if (pold_alignment)
|
||||
*pold_alignment = h->root.u.c.p->alignment_power;
|
||||
break;
|
||||
}
|
||||
if (poldbfd && *poldbfd == NULL)
|
||||
*poldbfd = oldbfd;
|
||||
|
||||
/* Differentiate strong and weak symbols. */
|
||||
newweak = bind == STB_WEAK;
|
||||
oldweak = (h->root.type == bfd_link_hash_defweak
|
||||
|| h->root.type == bfd_link_hash_undefweak);
|
||||
if (pold_weak)
|
||||
*pold_weak = oldweak;
|
||||
|
||||
/* This code is for coping with dynamic objects, and is only useful
|
||||
if we are doing an ELF link. */
|
||||
if (!(*bed->relocs_compatible) (abfd->xvec, info->output_bfd->xvec))
|
||||
return TRUE;
|
||||
|
||||
/* We have to check it for every instance since the first few may be
|
||||
references and not all compilers emit symbol type for undefined
|
||||
symbols. */
|
||||
|
@ -1007,45 +1045,6 @@ _bfd_elf_merge_symbol (bfd *abfd,
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
/* OLDBFD and OLDSEC are a BFD and an ASECTION associated with the
|
||||
existing symbol. */
|
||||
|
||||
switch (h->root.type)
|
||||
{
|
||||
default:
|
||||
oldbfd = NULL;
|
||||
oldsec = NULL;
|
||||
break;
|
||||
|
||||
case bfd_link_hash_undefined:
|
||||
case bfd_link_hash_undefweak:
|
||||
oldbfd = h->root.u.undef.abfd;
|
||||
oldsec = NULL;
|
||||
break;
|
||||
|
||||
case bfd_link_hash_defined:
|
||||
case bfd_link_hash_defweak:
|
||||
oldbfd = h->root.u.def.section->owner;
|
||||
oldsec = h->root.u.def.section;
|
||||
break;
|
||||
|
||||
case bfd_link_hash_common:
|
||||
oldbfd = h->root.u.c.p->section->owner;
|
||||
oldsec = h->root.u.c.p->section;
|
||||
if (pold_alignment)
|
||||
*pold_alignment = h->root.u.c.p->alignment_power;
|
||||
break;
|
||||
}
|
||||
if (poldbfd && *poldbfd == NULL)
|
||||
*poldbfd = oldbfd;
|
||||
|
||||
/* Differentiate strong and weak symbols. */
|
||||
newweak = bind == STB_WEAK;
|
||||
oldweak = (h->root.type == bfd_link_hash_defweak
|
||||
|| h->root.type == bfd_link_hash_undefweak);
|
||||
if (pold_weak)
|
||||
*pold_weak = oldweak;
|
||||
|
||||
/* In cases involving weak versioned symbols, we may wind up trying
|
||||
to merge a symbol with itself. Catch that here, to avoid the
|
||||
confusion that results if we try to override a symbol with
|
||||
|
|
Loading…
Reference in New Issue