* elflink.h (elf_fix_symbol_flags): Copy flags to weakdef using
elf_backend_copy_indirect_symbol so that backend has a chance to copy other necessary fields. * elf-bfd.h (struct elf_backend_data): Update description of elf_backend_copy_indirect_symbol. * elf.c (_bfd_elf_link_hash_copy_indirect): Bail out after copying flags if this is a weakdef. * elfxx-ia64.c (elfNN_ia64_hash_copy_indirect): Likewise. (elfNN_ia64_aix_add_symbol_hook): Use elf_link_hash_lookup rather than bfd_link_hash_lookup. * elf32-i386 (elf_i386_adjust_dynamic_symbol): Don't do copy reloc processing for weakdefs. * elf32-hppa.c (elf32_hppa_adjust_dynamic_symbol): Likewise. * elf64-ppc.c (ppc64_elf_adjust_dynamic_symbol): Likewise.
This commit is contained in:
parent
7997c6eaf4
commit
0a991dfe0d
8 changed files with 40 additions and 9 deletions
|
@ -1,3 +1,20 @@
|
||||||
|
2001-10-03 Alan Modra <amodra@bigpond.net.au>
|
||||||
|
|
||||||
|
* elflink.h (elf_fix_symbol_flags): Copy flags to weakdef using
|
||||||
|
elf_backend_copy_indirect_symbol so that backend has a chance to
|
||||||
|
copy other necessary fields.
|
||||||
|
* elf-bfd.h (struct elf_backend_data): Update description of
|
||||||
|
elf_backend_copy_indirect_symbol.
|
||||||
|
* elf.c (_bfd_elf_link_hash_copy_indirect): Bail out after
|
||||||
|
copying flags if this is a weakdef.
|
||||||
|
* elfxx-ia64.c (elfNN_ia64_hash_copy_indirect): Likewise.
|
||||||
|
(elfNN_ia64_aix_add_symbol_hook): Use elf_link_hash_lookup rather
|
||||||
|
than bfd_link_hash_lookup.
|
||||||
|
* elf32-i386 (elf_i386_adjust_dynamic_symbol): Don't do copy
|
||||||
|
reloc processing for weakdefs.
|
||||||
|
* elf32-hppa.c (elf32_hppa_adjust_dynamic_symbol): Likewise.
|
||||||
|
* elf64-ppc.c (ppc64_elf_adjust_dynamic_symbol): Likewise.
|
||||||
|
|
||||||
2001-10-02 Alan Modra <amodra@bigpond.net.au>
|
2001-10-02 Alan Modra <amodra@bigpond.net.au>
|
||||||
|
|
||||||
* elf64-ppc.c (ppc64_elf_check_relocs): Use a local var and cast
|
* elf64-ppc.c (ppc64_elf_check_relocs): Use a local var and cast
|
||||||
|
|
|
@ -648,8 +648,11 @@ struct elf_backend_data
|
||||||
PARAMS ((bfd *, struct bfd_link_info *, PTR,
|
PARAMS ((bfd *, struct bfd_link_info *, PTR,
|
||||||
boolean (*) (PTR, const char *, Elf_Internal_Sym *, asection *)));
|
boolean (*) (PTR, const char *, Elf_Internal_Sym *, asection *)));
|
||||||
|
|
||||||
/* Copy any information related to dynamic linking from a pre-existing
|
/* Copy any information related to dynamic linking from a pre-existing
|
||||||
symbol IND to a newly created symbol DIR. */
|
symbol to a newly created symbol. Also called to copy flags and
|
||||||
|
other back-end info to a weakdef, in which case the symbol is not
|
||||||
|
newly created and plt/got refcounts and dynamic indices should not
|
||||||
|
be copied. */
|
||||||
void (*elf_backend_copy_indirect_symbol)
|
void (*elf_backend_copy_indirect_symbol)
|
||||||
PARAMS ((struct elf_link_hash_entry *, struct elf_link_hash_entry *));
|
PARAMS ((struct elf_link_hash_entry *, struct elf_link_hash_entry *));
|
||||||
|
|
||||||
|
|
|
@ -986,7 +986,7 @@ _bfd_elf_link_hash_newfunc (entry, table, string)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Copy data from an indirect symbol to its direct symbol, hiding the
|
/* Copy data from an indirect symbol to its direct symbol, hiding the
|
||||||
old indirect symbol. */
|
old indirect symbol. Also used for copying flags to a weakdef. */
|
||||||
|
|
||||||
void
|
void
|
||||||
_bfd_elf_link_hash_copy_indirect (dir, ind)
|
_bfd_elf_link_hash_copy_indirect (dir, ind)
|
||||||
|
@ -1004,6 +1004,9 @@ _bfd_elf_link_hash_copy_indirect (dir, ind)
|
||||||
| ELF_LINK_HASH_REF_REGULAR_NONWEAK
|
| ELF_LINK_HASH_REF_REGULAR_NONWEAK
|
||||||
| ELF_LINK_NON_GOT_REF));
|
| ELF_LINK_NON_GOT_REF));
|
||||||
|
|
||||||
|
if (dir == ind->weakdef)
|
||||||
|
return;
|
||||||
|
|
||||||
/* Copy over the global and procedure linkage table refcount entries.
|
/* Copy over the global and procedure linkage table refcount entries.
|
||||||
These may have been already set up by a check_relocs routine. */
|
These may have been already set up by a check_relocs routine. */
|
||||||
tmp = dir->got.refcount;
|
tmp = dir->got.refcount;
|
||||||
|
|
|
@ -1855,6 +1855,7 @@ elf32_hppa_adjust_dynamic_symbol (info, h)
|
||||||
abort ();
|
abort ();
|
||||||
h->root.u.def.section = h->weakdef->root.u.def.section;
|
h->root.u.def.section = h->weakdef->root.u.def.section;
|
||||||
h->root.u.def.value = h->weakdef->root.u.def.value;
|
h->root.u.def.value = h->weakdef->root.u.def.value;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This is a reference to a symbol defined by a dynamic object which
|
/* This is a reference to a symbol defined by a dynamic object which
|
||||||
|
|
|
@ -1109,6 +1109,7 @@ elf_i386_adjust_dynamic_symbol (info, h)
|
||||||
|| h->weakdef->root.type == bfd_link_hash_defweak);
|
|| h->weakdef->root.type == bfd_link_hash_defweak);
|
||||||
h->root.u.def.section = h->weakdef->root.u.def.section;
|
h->root.u.def.section = h->weakdef->root.u.def.section;
|
||||||
h->root.u.def.value = h->weakdef->root.u.def.value;
|
h->root.u.def.value = h->weakdef->root.u.def.value;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This is a reference to a symbol defined by a dynamic object which
|
/* This is a reference to a symbol defined by a dynamic object which
|
||||||
|
|
|
@ -2376,6 +2376,7 @@ ppc64_elf_adjust_dynamic_symbol (info, h)
|
||||||
|| h->weakdef->root.type == bfd_link_hash_defweak);
|
|| h->weakdef->root.type == bfd_link_hash_defweak);
|
||||||
h->root.u.def.section = h->weakdef->root.u.def.section;
|
h->root.u.def.section = h->weakdef->root.u.def.section;
|
||||||
h->root.u.def.value = h->weakdef->root.u.def.value;
|
h->root.u.def.value = h->weakdef->root.u.def.value;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This is a reference to a symbol defined by a dynamic object which
|
/* This is a reference to a symbol defined by a dynamic object which
|
||||||
|
|
|
@ -3615,11 +3615,12 @@ elf_fix_symbol_flags (h, eif)
|
||||||
if ((weakdef->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0)
|
if ((weakdef->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0)
|
||||||
h->weakdef = NULL;
|
h->weakdef = NULL;
|
||||||
else
|
else
|
||||||
weakdef->elf_link_hash_flags |=
|
{
|
||||||
(h->elf_link_hash_flags
|
struct elf_backend_data *bed;
|
||||||
& (ELF_LINK_HASH_REF_REGULAR
|
|
||||||
| ELF_LINK_HASH_REF_REGULAR_NONWEAK
|
bed = get_elf_backend_data (elf_hash_table (eif->info)->dynobj);
|
||||||
| ELF_LINK_NON_GOT_REF));
|
(*bed->elf_backend_copy_indirect_symbol) (weakdef, h);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -1190,7 +1190,8 @@ elfNN_ia64_aix_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
|
||||||
no one else should use it b/c it is undocumented. */
|
no one else should use it b/c it is undocumented. */
|
||||||
struct elf_link_hash_entry *h;
|
struct elf_link_hash_entry *h;
|
||||||
|
|
||||||
h = (struct elf_link_hash_entry *) bfd_link_hash_lookup (info->hash, *namep, false, false, false);
|
h = elf_link_hash_lookup (elf_hash_table (info), *namep,
|
||||||
|
false, false, false);
|
||||||
if (h == NULL)
|
if (h == NULL)
|
||||||
{
|
{
|
||||||
struct elf_backend_data *bed;
|
struct elf_backend_data *bed;
|
||||||
|
@ -1523,6 +1524,9 @@ elfNN_ia64_hash_copy_indirect (xdir, xind)
|
||||||
| ELF_LINK_HASH_REF_REGULAR
|
| ELF_LINK_HASH_REF_REGULAR
|
||||||
| ELF_LINK_HASH_REF_REGULAR_NONWEAK));
|
| ELF_LINK_HASH_REF_REGULAR_NONWEAK));
|
||||||
|
|
||||||
|
if (dir == ind->weakdef)
|
||||||
|
return;
|
||||||
|
|
||||||
/* Copy over the got and plt data. This would have been done
|
/* Copy over the got and plt data. This would have been done
|
||||||
by check_relocs. */
|
by check_relocs. */
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue