include/
* bfdlink.h (struct bfd_link_hash_entry): Move und_next into elements of union. bfd/ * ecoff.c: Update u.undef.next refs. * elf64-ppc.c: Likewise. * elflink.c: Likewise. * linker.c: Likewise. * xcofflink.c: Likewise. ld/ * ldexp.c (fold_name): Update u.undef.next refs. * emultempl/pe.em: Likewise. * emultempl/sunos.em: Likewise. bfd/ * elf-bfd.h (struct elf_link_hash_entry): Rearrange. Add FIXME to dynamic_def. Combine weakdef and elf_hash_value. Move vtable fields to indirect struct. * elf-m10300.c: Update u.weakdef refs. * elf32-arm.h: Likewise. * elf32-cris.c: Likewise. * elf32-frv.c: Likewise. * elf32-hppa.c: Likewise. * elf32-i370.c: Likewise. * elf32-i386.c: Likewise. * elf32-m32r.c: Likewise. * elf32-m68k.c: Likewise. * elf32-ppc.c: Likewise. * elf32-s390.c: Likewise. * elf32-sh.c: Likewise. * elf32-sparc.c: Likewise. * elf32-vax.c: Likewise. * elf32-xtensa.c: Likewise. * elf64-alpha.c: Likewise. * elf64-hppa.c: Likewise. * elf64-ppc.c: Likewise. * elf64-s390.c: Likewise. * elf64-sh64.c: Likewise. * elf64-sparc.c: Likewise. * elf64-x86-64.c: Likewise. * elfxx-ia64.c: Likewise. * elfxx-mips.c: Likewise. * elflink.c: Likewise. Also u.elf_hash_value. (elf_gc_propagate_vtable_entries_used): Update for h->vtable indirection. (elf_gc_smash_unused_vtentry_relocs): Likewise. (bfd_elf_gc_record_vtinherit): Alloc vtable. (bfd_elf_gc_record_vtentry): Likewise. * elf.c (_bfd_elf_link_hash_newfunc): Use memset.
This commit is contained in:
parent
bafcb7227e
commit
f6e332e660
37 changed files with 360 additions and 305 deletions
|
@ -1,3 +1,46 @@
|
|||
2004-09-17 Alan Modra <amodra@bigpond.net.au>
|
||||
|
||||
* ecoff.c: Update u.undef.next refs.
|
||||
* elf64-ppc.c: Likewise.
|
||||
* elflink.c: Likewise.
|
||||
* linker.c: Likewise.
|
||||
* xcofflink.c: Likewise.
|
||||
|
||||
* elf-bfd.h (struct elf_link_hash_entry): Rearrange. Add FIXME to
|
||||
dynamic_def. Combine weakdef and elf_hash_value. Move vtable
|
||||
fields to indirect struct.
|
||||
* elf-m10300.c: Update u.weakdef refs.
|
||||
* elf32-arm.h: Likewise.
|
||||
* elf32-cris.c: Likewise.
|
||||
* elf32-frv.c: Likewise.
|
||||
* elf32-hppa.c: Likewise.
|
||||
* elf32-i370.c: Likewise.
|
||||
* elf32-i386.c: Likewise.
|
||||
* elf32-m32r.c: Likewise.
|
||||
* elf32-m68k.c: Likewise.
|
||||
* elf32-ppc.c: Likewise.
|
||||
* elf32-s390.c: Likewise.
|
||||
* elf32-sh.c: Likewise.
|
||||
* elf32-sparc.c: Likewise.
|
||||
* elf32-vax.c: Likewise.
|
||||
* elf32-xtensa.c: Likewise.
|
||||
* elf64-alpha.c: Likewise.
|
||||
* elf64-hppa.c: Likewise.
|
||||
* elf64-ppc.c: Likewise.
|
||||
* elf64-s390.c: Likewise.
|
||||
* elf64-sh64.c: Likewise.
|
||||
* elf64-sparc.c: Likewise.
|
||||
* elf64-x86-64.c: Likewise.
|
||||
* elfxx-ia64.c: Likewise.
|
||||
* elfxx-mips.c: Likewise.
|
||||
* elflink.c: Likewise. Also u.elf_hash_value.
|
||||
(elf_gc_propagate_vtable_entries_used): Update for h->vtable
|
||||
indirection.
|
||||
(elf_gc_smash_unused_vtentry_relocs): Likewise.
|
||||
(bfd_elf_gc_record_vtinherit): Alloc vtable.
|
||||
(bfd_elf_gc_record_vtentry): Likewise.
|
||||
* elf.c (_bfd_elf_link_hash_newfunc): Use memset.
|
||||
|
||||
2004-09-17 Alan Modra <amodra@bigpond.net.au>
|
||||
|
||||
* Makefile.am: Run "make dep-am".
|
||||
|
|
12
bfd/ecoff.c
12
bfd/ecoff.c
|
@ -3563,9 +3563,9 @@ ecoff_link_add_archive_symbols (abfd, info)
|
|||
entry if it is the tail, because that would lose any
|
||||
entries we add to the list later on. */
|
||||
if (*pundef != info->hash->undefs_tail)
|
||||
*pundef = (*pundef)->und_next;
|
||||
*pundef = (*pundef)->u.undef.next;
|
||||
else
|
||||
pundef = &(*pundef)->und_next;
|
||||
pundef = &(*pundef)->u.undef.next;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -3575,7 +3575,7 @@ ecoff_link_add_archive_symbols (abfd, info)
|
|||
other object format. */
|
||||
if (h->type != bfd_link_hash_undefined)
|
||||
{
|
||||
pundef = &(*pundef)->und_next;
|
||||
pundef = &(*pundef)->u.undef.next;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -3587,7 +3587,7 @@ ecoff_link_add_archive_symbols (abfd, info)
|
|||
if (file_offset == 0)
|
||||
{
|
||||
/* Nothing in this slot. */
|
||||
pundef = &(*pundef)->und_next;
|
||||
pundef = &(*pundef)->u.undef.next;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -3618,7 +3618,7 @@ ecoff_link_add_archive_symbols (abfd, info)
|
|||
|
||||
if (! found)
|
||||
{
|
||||
pundef = &(*pundef)->und_next;
|
||||
pundef = &(*pundef)->u.undef.next;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -3640,7 +3640,7 @@ ecoff_link_add_archive_symbols (abfd, info)
|
|||
if (! ecoff_link_add_object_symbols (element, info))
|
||||
return FALSE;
|
||||
|
||||
pundef = &(*pundef)->und_next;
|
||||
pundef = &(*pundef)->u.undef.next;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
|
|
@ -104,40 +104,6 @@ struct elf_link_hash_entry
|
|||
not visible outside this DSO. */
|
||||
long dynindx;
|
||||
|
||||
/* String table index in .dynstr if this is a dynamic symbol. */
|
||||
unsigned long dynstr_index;
|
||||
|
||||
/* Hash value of the name computed using the ELF hash function. */
|
||||
unsigned long elf_hash_value;
|
||||
|
||||
/* If this is a weak defined symbol from a dynamic object, this
|
||||
field points to a defined symbol with the same value, if there is
|
||||
one. Otherwise it is NULL. */
|
||||
struct elf_link_hash_entry *weakdef;
|
||||
|
||||
/* Version information. */
|
||||
union
|
||||
{
|
||||
/* This field is used for a symbol which is not defined in a
|
||||
regular object. It points to the version information read in
|
||||
from the dynamic object. */
|
||||
Elf_Internal_Verdef *verdef;
|
||||
/* This field is used for a symbol which is defined in a regular
|
||||
object. It is set up in size_dynamic_sections. It points to
|
||||
the version information we should write out for this symbol. */
|
||||
struct bfd_elf_version_tree *vertree;
|
||||
} verinfo;
|
||||
|
||||
/* Virtual table entry use information. This array is nominally of size
|
||||
size/sizeof(target_void_pointer), though we have to be able to assume
|
||||
and track a size while the symbol is still undefined. It is indexed
|
||||
via offset/sizeof(target_void_pointer). */
|
||||
size_t vtable_entries_size;
|
||||
bfd_boolean *vtable_entries_used;
|
||||
|
||||
/* Virtual table derivation info. */
|
||||
struct elf_link_hash_entry *vtable_parent;
|
||||
|
||||
/* If this symbol requires an entry in the global offset table, the
|
||||
processor specific backend uses this field to track usage and
|
||||
final offset. Two schemes are supported: The first assumes that
|
||||
|
@ -194,13 +160,57 @@ struct elf_link_hash_entry
|
|||
/* Symbol is referenced by a non-GOT/non-PLT relocation. This is
|
||||
not currently set by all the backends. */
|
||||
unsigned int non_got_ref : 1;
|
||||
/* Symbol has a definition in a shared object. */
|
||||
/* Symbol has a definition in a shared object.
|
||||
FIXME: There is no real need for this field if def_dynamic is never
|
||||
cleared and all places that test def_dynamic also test def_regular. */
|
||||
unsigned int dynamic_def : 1;
|
||||
/* Symbol is weak in all shared objects. */
|
||||
unsigned int dynamic_weak : 1;
|
||||
/* Symbol is referenced with a relocation where C/C++ pointer equality
|
||||
matters. */
|
||||
unsigned int pointer_equality_needed : 1;
|
||||
|
||||
/* String table index in .dynstr if this is a dynamic symbol. */
|
||||
unsigned long dynstr_index;
|
||||
|
||||
union
|
||||
{
|
||||
/* If this is a weak defined symbol from a dynamic object, this
|
||||
field points to a defined symbol with the same value, if there is
|
||||
one. Otherwise it is NULL. */
|
||||
struct elf_link_hash_entry *weakdef;
|
||||
|
||||
/* Hash value of the name computed using the ELF hash function.
|
||||
Used part way through size_dynamic_sections, after we've finished
|
||||
with weakdefs. */
|
||||
unsigned long elf_hash_value;
|
||||
} u;
|
||||
|
||||
/* Version information. */
|
||||
union
|
||||
{
|
||||
/* This field is used for a symbol which is not defined in a
|
||||
regular object. It points to the version information read in
|
||||
from the dynamic object. */
|
||||
Elf_Internal_Verdef *verdef;
|
||||
/* This field is used for a symbol which is defined in a regular
|
||||
object. It is set up in size_dynamic_sections. It points to
|
||||
the version information we should write out for this symbol. */
|
||||
struct bfd_elf_version_tree *vertree;
|
||||
} verinfo;
|
||||
|
||||
struct
|
||||
{
|
||||
/* Virtual table entry use information. This array is nominally of size
|
||||
size/sizeof(target_void_pointer), though we have to be able to assume
|
||||
and track a size while the symbol is still undefined. It is indexed
|
||||
via offset/sizeof(target_void_pointer). */
|
||||
size_t size;
|
||||
bfd_boolean *used;
|
||||
|
||||
/* Virtual table derivation info. */
|
||||
struct elf_link_hash_entry *parent;
|
||||
} *vtable;
|
||||
};
|
||||
|
||||
/* Will references to this symbol always reference the symbol
|
||||
|
|
|
@ -4021,7 +4021,7 @@ _bfd_mn10300_elf_adjust_dynamic_symbol (info, h)
|
|||
/* Make sure we know what is going on here. */
|
||||
BFD_ASSERT (dynobj != NULL
|
||||
&& (h->needs_plt
|
||||
|| h->weakdef != NULL
|
||||
|| h->u.weakdef != NULL
|
||||
|| (h->def_dynamic
|
||||
&& h->ref_regular
|
||||
&& !h->def_regular)));
|
||||
|
@ -4096,12 +4096,12 @@ _bfd_mn10300_elf_adjust_dynamic_symbol (info, h)
|
|||
/* If this is a weak symbol, and there is a real definition, the
|
||||
processor independent code will have arranged for us to see the
|
||||
real definition first, and we can just use the same value. */
|
||||
if (h->weakdef != NULL)
|
||||
if (h->u.weakdef != NULL)
|
||||
{
|
||||
BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->weakdef->root.u.def.value;
|
||||
BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->u.weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->u.weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->u.weakdef->root.u.def.value;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
30
bfd/elf.c
30
bfd/elf.c
|
@ -1391,38 +1391,14 @@ _bfd_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
|
|||
/* Set local fields. */
|
||||
ret->indx = -1;
|
||||
ret->dynindx = -1;
|
||||
ret->dynstr_index = 0;
|
||||
ret->elf_hash_value = 0;
|
||||
ret->weakdef = NULL;
|
||||
ret->verinfo.verdef = NULL;
|
||||
ret->vtable_entries_size = 0;
|
||||
ret->vtable_entries_used = NULL;
|
||||
ret->vtable_parent = NULL;
|
||||
ret->got = htab->init_refcount;
|
||||
ret->plt = htab->init_refcount;
|
||||
ret->size = 0;
|
||||
ret->type = STT_NOTYPE;
|
||||
ret->other = 0;
|
||||
ret->got = ret->plt = htab->init_refcount;
|
||||
memset (&ret->size, 0, (sizeof (struct elf_link_hash_entry)
|
||||
- offsetof (struct elf_link_hash_entry, size)));
|
||||
/* Assume that we have been called by a non-ELF symbol reader.
|
||||
This flag is then reset by the code which reads an ELF input
|
||||
file. This ensures that a symbol created by a non-ELF symbol
|
||||
reader will have the flag set correctly. */
|
||||
ret->ref_regular = 0;
|
||||
ret->def_regular = 0;
|
||||
ret->ref_dynamic = 0;
|
||||
ret->def_dynamic = 0;
|
||||
ret->ref_regular_nonweak = 0;
|
||||
ret->dynamic_adjusted = 0;
|
||||
ret->needs_copy = 0;
|
||||
ret->needs_plt = 0;
|
||||
ret->non_elf = 1;
|
||||
ret->hidden = 0;
|
||||
ret->forced_local = 0;
|
||||
ret->mark = 0;
|
||||
ret->non_got_ref = 0;
|
||||
ret->dynamic_def = 0;
|
||||
ret->dynamic_weak = 0;
|
||||
ret->pointer_equality_needed = 0;
|
||||
}
|
||||
|
||||
return entry;
|
||||
|
|
|
@ -3187,7 +3187,7 @@ elf32_arm_adjust_dynamic_symbol (struct bfd_link_info * info,
|
|||
/* Make sure we know what is going on here. */
|
||||
BFD_ASSERT (dynobj != NULL
|
||||
&& (h->needs_plt
|
||||
|| h->weakdef != NULL
|
||||
|| h->u.weakdef != NULL
|
||||
|| (h->def_dynamic
|
||||
&& h->ref_regular
|
||||
&& !h->def_regular)));
|
||||
|
@ -3225,12 +3225,12 @@ elf32_arm_adjust_dynamic_symbol (struct bfd_link_info * info,
|
|||
/* If this is a weak symbol, and there is a real definition, the
|
||||
processor independent code will have arranged for us to see the
|
||||
real definition first, and we can just use the same value. */
|
||||
if (h->weakdef != NULL)
|
||||
if (h->u.weakdef != NULL)
|
||||
{
|
||||
BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->weakdef->root.u.def.value;
|
||||
BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->u.weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->u.weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->u.weakdef->root.u.def.value;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
@ -2024,7 +2024,7 @@ elf_cris_adjust_dynamic_symbol (info, h)
|
|||
/* Make sure we know what is going on here. */
|
||||
BFD_ASSERT (dynobj != NULL
|
||||
&& (h->needs_plt
|
||||
|| h->weakdef != NULL
|
||||
|| h->u.weakdef != NULL
|
||||
|| (h->def_dynamic
|
||||
&& h->ref_regular
|
||||
&& !h->def_regular)));
|
||||
|
@ -2162,12 +2162,12 @@ elf_cris_adjust_dynamic_symbol (info, h)
|
|||
/* If this is a weak symbol, and there is a real definition, the
|
||||
processor independent code will have arranged for us to see the
|
||||
real definition first, and we can just use the same value. */
|
||||
if (h->weakdef != NULL)
|
||||
if (h->u.weakdef != NULL)
|
||||
{
|
||||
BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->weakdef->root.u.def.value;
|
||||
BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->u.weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->u.weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->u.weakdef->root.u.def.value;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
@ -3865,7 +3865,7 @@ elf32_frvfdpic_adjust_dynamic_symbol
|
|||
|
||||
/* Make sure we know what is going on here. */
|
||||
BFD_ASSERT (dynobj != NULL
|
||||
&& (h->weakdef != NULL
|
||||
&& (h->u.weakdef != NULL
|
||||
|| (h->def_dynamic
|
||||
&& h->ref_regular
|
||||
&& !h->def_regular)));
|
||||
|
@ -3873,12 +3873,12 @@ elf32_frvfdpic_adjust_dynamic_symbol
|
|||
/* If this is a weak symbol, and there is a real definition, the
|
||||
processor independent code will have arranged for us to see the
|
||||
real definition first, and we can just use the same value. */
|
||||
if (h->weakdef != NULL)
|
||||
if (h->u.weakdef != NULL)
|
||||
{
|
||||
BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->weakdef->root.u.def.value;
|
||||
BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->u.weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->u.weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->u.weakdef->root.u.def.value;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
|
|
@ -1671,15 +1671,15 @@ elf32_hppa_adjust_dynamic_symbol (struct bfd_link_info *info,
|
|||
/* If this is a weak symbol, and there is a real definition, the
|
||||
processor independent code will have arranged for us to see the
|
||||
real definition first, and we can just use the same value. */
|
||||
if (h->weakdef != NULL)
|
||||
if (h->u.weakdef != NULL)
|
||||
{
|
||||
if (h->weakdef->root.type != bfd_link_hash_defined
|
||||
&& h->weakdef->root.type != bfd_link_hash_defweak)
|
||||
if (h->u.weakdef->root.type != bfd_link_hash_defined
|
||||
&& h->u.weakdef->root.type != bfd_link_hash_defweak)
|
||||
abort ();
|
||||
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.section = h->u.weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->u.weakdef->root.u.def.value;
|
||||
if (ELIMINATE_COPY_RELOCS)
|
||||
h->non_got_ref = h->weakdef->non_got_ref;
|
||||
h->non_got_ref = h->u.weakdef->non_got_ref;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
@ -501,7 +501,7 @@ i370_elf_adjust_dynamic_symbol (info, h)
|
|||
/* Make sure we know what is going on here. */
|
||||
BFD_ASSERT (dynobj != NULL
|
||||
&& (h->needs_plt
|
||||
|| h->weakdef != NULL
|
||||
|| h->u.weakdef != NULL
|
||||
|| (h->def_dynamic
|
||||
&& h->ref_regular
|
||||
&& !h->def_regular)));
|
||||
|
@ -513,12 +513,12 @@ i370_elf_adjust_dynamic_symbol (info, h)
|
|||
/* If this is a weak symbol, and there is a real definition, the
|
||||
processor independent code will have arranged for us to see the
|
||||
real definition first, and we can just use the same value. */
|
||||
if (h->weakdef != NULL)
|
||||
if (h->u.weakdef != NULL)
|
||||
{
|
||||
BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->weakdef->root.u.def.value;
|
||||
BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->u.weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->u.weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->u.weakdef->root.u.def.value;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
@ -1354,14 +1354,14 @@ elf_i386_adjust_dynamic_symbol (struct bfd_link_info *info,
|
|||
/* If this is a weak symbol, and there is a real definition, the
|
||||
processor independent code will have arranged for us to see the
|
||||
real definition first, and we can just use the same value. */
|
||||
if (h->weakdef != NULL)
|
||||
if (h->u.weakdef != NULL)
|
||||
{
|
||||
BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->weakdef->root.u.def.value;
|
||||
BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->u.weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->u.weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->u.weakdef->root.u.def.value;
|
||||
if (ELIMINATE_COPY_RELOCS || info->nocopyreloc)
|
||||
h->non_got_ref = h->weakdef->non_got_ref;
|
||||
h->non_got_ref = h->u.weakdef->non_got_ref;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
@ -1955,7 +1955,7 @@ printf("m32r_elf_adjust_dynamic_symbol()\n");
|
|||
/* Make sure we know what is going on here. */
|
||||
BFD_ASSERT (dynobj != NULL
|
||||
&& (h->needs_plt
|
||||
|| h->weakdef != NULL
|
||||
|| h->u.weakdef != NULL
|
||||
|| (h->def_dynamic
|
||||
&& h->ref_regular
|
||||
&& !h->def_regular)));
|
||||
|
@ -1990,12 +1990,12 @@ printf("m32r_elf_adjust_dynamic_symbol()\n");
|
|||
/* If this is a weak symbol, and there is a real definition, the
|
||||
processor independent code will have arranged for us to see the
|
||||
real definition first, and we can just use the same value. */
|
||||
if (h->weakdef != NULL)
|
||||
if (h->u.weakdef != NULL)
|
||||
{
|
||||
BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->weakdef->root.u.def.value;
|
||||
BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->u.weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->u.weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->u.weakdef->root.u.def.value;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
@ -925,7 +925,7 @@ elf_m68k_adjust_dynamic_symbol (info, h)
|
|||
/* Make sure we know what is going on here. */
|
||||
BFD_ASSERT (dynobj != NULL
|
||||
&& (h->needs_plt
|
||||
|| h->weakdef != NULL
|
||||
|| h->u.weakdef != NULL
|
||||
|| (h->def_dynamic
|
||||
&& h->ref_regular
|
||||
&& !h->def_regular)));
|
||||
|
@ -1024,12 +1024,12 @@ elf_m68k_adjust_dynamic_symbol (info, h)
|
|||
/* If this is a weak symbol, and there is a real definition, the
|
||||
processor independent code will have arranged for us to see the
|
||||
real definition first, and we can just use the same value. */
|
||||
if (h->weakdef != NULL)
|
||||
if (h->u.weakdef != NULL)
|
||||
{
|
||||
BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->weakdef->root.u.def.value;
|
||||
BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->u.weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->u.weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->u.weakdef->root.u.def.value;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
@ -2874,7 +2874,7 @@ ppc_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
|
|||
htab = ppc_elf_hash_table (info);
|
||||
BFD_ASSERT (htab->elf.dynobj != NULL
|
||||
&& (h->needs_plt
|
||||
|| h->weakdef != NULL
|
||||
|| h->u.weakdef != NULL
|
||||
|| (h->def_dynamic
|
||||
&& h->ref_regular
|
||||
&& !h->def_regular)));
|
||||
|
@ -2911,14 +2911,14 @@ ppc_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
|
|||
/* If this is a weak symbol, and there is a real definition, the
|
||||
processor independent code will have arranged for us to see the
|
||||
real definition first, and we can just use the same value. */
|
||||
if (h->weakdef != NULL)
|
||||
if (h->u.weakdef != NULL)
|
||||
{
|
||||
BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->weakdef->root.u.def.value;
|
||||
BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->u.weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->u.weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->u.weakdef->root.u.def.value;
|
||||
if (ELIMINATE_COPY_RELOCS)
|
||||
h->non_got_ref = h->weakdef->non_got_ref;
|
||||
h->non_got_ref = h->u.weakdef->non_got_ref;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
@ -1611,14 +1611,14 @@ elf_s390_adjust_dynamic_symbol (info, h)
|
|||
/* If this is a weak symbol, and there is a real definition, the
|
||||
processor independent code will have arranged for us to see the
|
||||
real definition first, and we can just use the same value. */
|
||||
if (h->weakdef != NULL)
|
||||
if (h->u.weakdef != NULL)
|
||||
{
|
||||
BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->weakdef->root.u.def.value;
|
||||
BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->u.weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->u.weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->u.weakdef->root.u.def.value;
|
||||
if (ELIMINATE_COPY_RELOCS || info->nocopyreloc)
|
||||
h->non_got_ref = h->weakdef->non_got_ref;
|
||||
h->non_got_ref = h->u.weakdef->non_got_ref;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
@ -4018,7 +4018,7 @@ sh_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
|
|||
/* Make sure we know what is going on here. */
|
||||
BFD_ASSERT (htab->root.dynobj != NULL
|
||||
&& (h->needs_plt
|
||||
|| h->weakdef != NULL
|
||||
|| h->u.weakdef != NULL
|
||||
|| (h->def_dynamic
|
||||
&& h->ref_regular
|
||||
&& !h->def_regular)));
|
||||
|
@ -4051,14 +4051,14 @@ sh_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
|
|||
/* If this is a weak symbol, and there is a real definition, the
|
||||
processor independent code will have arranged for us to see the
|
||||
real definition first, and we can just use the same value. */
|
||||
if (h->weakdef != NULL)
|
||||
if (h->u.weakdef != NULL)
|
||||
{
|
||||
BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->weakdef->root.u.def.value;
|
||||
BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->u.weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->u.weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->u.weakdef->root.u.def.value;
|
||||
if (info->nocopyreloc)
|
||||
h->non_got_ref = h->weakdef->non_got_ref;
|
||||
h->non_got_ref = h->u.weakdef->non_got_ref;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
@ -1456,7 +1456,7 @@ elf32_sparc_adjust_dynamic_symbol (info, h)
|
|||
/* Make sure we know what is going on here. */
|
||||
BFD_ASSERT (htab->elf.dynobj != NULL
|
||||
&& (h->needs_plt
|
||||
|| h->weakdef != NULL
|
||||
|| h->u.weakdef != NULL
|
||||
|| (h->def_dynamic
|
||||
&& h->ref_regular
|
||||
&& !h->def_regular)));
|
||||
|
@ -1499,12 +1499,12 @@ elf32_sparc_adjust_dynamic_symbol (info, h)
|
|||
/* If this is a weak symbol, and there is a real definition, the
|
||||
processor independent code will have arranged for us to see the
|
||||
real definition first, and we can just use the same value. */
|
||||
if (h->weakdef != NULL)
|
||||
if (h->u.weakdef != NULL)
|
||||
{
|
||||
BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->weakdef->root.u.def.value;
|
||||
BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->u.weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->u.weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->u.weakdef->root.u.def.value;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
@ -962,7 +962,7 @@ elf_vax_adjust_dynamic_symbol (info, h)
|
|||
/* Make sure we know what is going on here. */
|
||||
BFD_ASSERT (dynobj != NULL
|
||||
&& (h->needs_plt
|
||||
|| h->weakdef != NULL
|
||||
|| h->u.weakdef != NULL
|
||||
|| (h->def_dynamic
|
||||
&& h->ref_regular
|
||||
&& !h->def_regular)));
|
||||
|
@ -1056,12 +1056,12 @@ elf_vax_adjust_dynamic_symbol (info, h)
|
|||
/* If this is a weak symbol, and there is a real definition, the
|
||||
processor independent code will have arranged for us to see the
|
||||
real definition first, and we can just use the same value. */
|
||||
if (h->weakdef != NULL)
|
||||
if (h->u.weakdef != NULL)
|
||||
{
|
||||
BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->weakdef->root.u.def.value;
|
||||
BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->u.weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->u.weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->u.weakdef->root.u.def.value;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
@ -984,12 +984,12 @@ elf_xtensa_adjust_dynamic_symbol (info, h)
|
|||
/* If this is a weak symbol, and there is a real definition, the
|
||||
processor independent code will have arranged for us to see the
|
||||
real definition first, and we can just use the same value. */
|
||||
if (h->weakdef != NULL)
|
||||
if (h->u.weakdef != NULL)
|
||||
{
|
||||
BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->weakdef->root.u.def.value;
|
||||
BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->u.weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->u.weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->u.weakdef->root.u.def.value;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
@ -3279,12 +3279,12 @@ elf64_alpha_adjust_dynamic_symbol (info, h)
|
|||
/* If this is a weak symbol, and there is a real definition, the
|
||||
processor independent code will have arranged for us to see the
|
||||
real definition first, and we can just use the same value. */
|
||||
if (h->weakdef != NULL)
|
||||
if (h->u.weakdef != NULL)
|
||||
{
|
||||
BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->weakdef->root.u.def.value;
|
||||
BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->u.weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->u.weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->u.weakdef->root.u.def.value;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
@ -1559,12 +1559,12 @@ elf64_hppa_adjust_dynamic_symbol (info, h)
|
|||
/* If this is a weak symbol, and there is a real definition, the
|
||||
processor independent code will have arranged for us to see the
|
||||
real definition first, and we can just use the same value. */
|
||||
if (h->weakdef != NULL)
|
||||
if (h->u.weakdef != NULL)
|
||||
{
|
||||
BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->weakdef->root.u.def.value;
|
||||
BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->u.weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->u.weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->u.weakdef->root.u.def.value;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
@ -4063,22 +4063,22 @@ ppc64_elf_check_directives (bfd *abfd ATTRIBUTE_UNUSED,
|
|||
if (h->type != bfd_link_hash_undefined
|
||||
&& h->type != bfd_link_hash_common)
|
||||
{
|
||||
*pun = h->und_next;
|
||||
h->und_next = NULL;
|
||||
*pun = h->u.undef.next;
|
||||
h->u.undef.next = NULL;
|
||||
if (h == htab->elf.root.undefs_tail)
|
||||
{
|
||||
if (pun == &htab->elf.root.undefs)
|
||||
htab->elf.root.undefs_tail = NULL;
|
||||
else
|
||||
/* pun points at an und_next field. Go back to
|
||||
/* pun points at an u.undef.next field. Go back to
|
||||
the start of the link_hash_entry. */
|
||||
htab->elf.root.undefs_tail = (struct bfd_link_hash_entry *)
|
||||
((char *) pun - ((char *) &h->und_next - (char *) h));
|
||||
((char *) pun - ((char *) &h->u.undef.next - (char *) h));
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
pun = &h->und_next;
|
||||
pun = &h->u.undef.next;
|
||||
}
|
||||
|
||||
htab->twiddled_syms = 0;
|
||||
|
@ -5498,14 +5498,14 @@ ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
|
|||
/* If this is a weak symbol, and there is a real definition, the
|
||||
processor independent code will have arranged for us to see the
|
||||
real definition first, and we can just use the same value. */
|
||||
if (h->weakdef != NULL)
|
||||
if (h->u.weakdef != NULL)
|
||||
{
|
||||
BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->weakdef->root.u.def.value;
|
||||
BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->u.weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->u.weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->u.weakdef->root.u.def.value;
|
||||
if (ELIMINATE_COPY_RELOCS)
|
||||
h->non_got_ref = h->weakdef->non_got_ref;
|
||||
h->non_got_ref = h->u.weakdef->non_got_ref;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
@ -1583,14 +1583,14 @@ elf_s390_adjust_dynamic_symbol (info, h)
|
|||
/* If this is a weak symbol, and there is a real definition, the
|
||||
processor independent code will have arranged for us to see the
|
||||
real definition first, and we can just use the same value. */
|
||||
if (h->weakdef != NULL)
|
||||
if (h->u.weakdef != NULL)
|
||||
{
|
||||
BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->weakdef->root.u.def.value;
|
||||
BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->u.weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->u.weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->u.weakdef->root.u.def.value;
|
||||
if (ELIMINATE_COPY_RELOCS || info->nocopyreloc)
|
||||
h->non_got_ref = h->weakdef->non_got_ref;
|
||||
h->non_got_ref = h->u.weakdef->non_got_ref;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
@ -3388,7 +3388,7 @@ sh64_elf64_adjust_dynamic_symbol (struct bfd_link_info *info,
|
|||
/* Make sure we know what is going on here. */
|
||||
BFD_ASSERT (dynobj != NULL
|
||||
&& (h->needs_plt
|
||||
|| h->weakdef != NULL
|
||||
|| h->u.weakdef != NULL
|
||||
|| (h->def_dynamic
|
||||
&& h->ref_regular
|
||||
&& !h->def_regular)));
|
||||
|
@ -3463,12 +3463,12 @@ sh64_elf64_adjust_dynamic_symbol (struct bfd_link_info *info,
|
|||
/* If this is a weak symbol, and there is a real definition, the
|
||||
processor independent code will have arranged for us to see the
|
||||
real definition first, and we can just use the same value. */
|
||||
if (h->weakdef != NULL)
|
||||
if (h->u.weakdef != NULL)
|
||||
{
|
||||
BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->weakdef->root.u.def.value;
|
||||
BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->u.weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->u.weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->u.weakdef->root.u.def.value;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
@ -1613,7 +1613,7 @@ sparc64_elf_adjust_dynamic_symbol (info, h)
|
|||
/* Make sure we know what is going on here. */
|
||||
BFD_ASSERT (dynobj != NULL
|
||||
&& (h->needs_plt
|
||||
|| h->weakdef != NULL
|
||||
|| h->u.weakdef != NULL
|
||||
|| (h->def_dynamic
|
||||
&& h->ref_regular
|
||||
&& !h->def_regular)));
|
||||
|
@ -1689,12 +1689,12 @@ sparc64_elf_adjust_dynamic_symbol (info, h)
|
|||
/* If this is a weak symbol, and there is a real definition, the
|
||||
processor independent code will have arranged for us to see the
|
||||
real definition first, and we can just use the same value. */
|
||||
if (h->weakdef != NULL)
|
||||
if (h->u.weakdef != NULL)
|
||||
{
|
||||
BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->weakdef->root.u.def.value;
|
||||
BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->u.weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->u.weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->u.weakdef->root.u.def.value;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
@ -1154,14 +1154,14 @@ elf64_x86_64_adjust_dynamic_symbol (struct bfd_link_info *info,
|
|||
/* If this is a weak symbol, and there is a real definition, the
|
||||
processor independent code will have arranged for us to see the
|
||||
real definition first, and we can just use the same value. */
|
||||
if (h->weakdef != NULL)
|
||||
if (h->u.weakdef != NULL)
|
||||
{
|
||||
BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->weakdef->root.u.def.value;
|
||||
BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->u.weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->u.weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->u.weakdef->root.u.def.value;
|
||||
if (ELIMINATE_COPY_RELOCS || info->nocopyreloc)
|
||||
h->non_got_ref = h->weakdef->non_got_ref;
|
||||
h->non_got_ref = h->u.weakdef->non_got_ref;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
108
bfd/elflink.c
108
bfd/elflink.c
|
@ -472,10 +472,10 @@ bfd_elf_record_link_assignment (bfd *output_bfd ATTRIBUTE_UNUSED,
|
|||
/* If this is a weak defined symbol, and we know a corresponding
|
||||
real symbol from the same dynamic object, make sure the real
|
||||
symbol is also made into a dynamic symbol. */
|
||||
if (h->weakdef != NULL
|
||||
&& h->weakdef->dynindx == -1)
|
||||
if (h->u.weakdef != NULL
|
||||
&& h->u.weakdef->dynindx == -1)
|
||||
{
|
||||
if (! bfd_elf_link_record_dynamic_symbol (info, h->weakdef))
|
||||
if (! bfd_elf_link_record_dynamic_symbol (info, h->u.weakdef))
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
@ -890,17 +890,16 @@ _bfd_elf_merge_symbol (bfd *abfd,
|
|||
if ((*sym_hash)->root.type == bfd_link_hash_indirect)
|
||||
h = *sym_hash;
|
||||
|
||||
if ((h->root.und_next || info->hash->undefs_tail == &h->root)
|
||||
if ((h->root.u.undef.next || info->hash->undefs_tail == &h->root)
|
||||
&& bfd_is_und_section (sec))
|
||||
{
|
||||
/* If the new symbol is undefined and the old symbol was
|
||||
also undefined before, we need to make sure
|
||||
_bfd_generic_link_add_one_symbol doesn't mess
|
||||
up the linker hash table undefs list. Since the old
|
||||
up the linker hash table undefs list. Since the old
|
||||
definition came from a dynamic object, it is still on the
|
||||
undefs list. */
|
||||
h->root.type = bfd_link_hash_undefined;
|
||||
/* FIXME: What if the new symbol is weak undefined? */
|
||||
h->root.u.undef.abfd = abfd;
|
||||
}
|
||||
else
|
||||
|
@ -2193,11 +2192,11 @@ _bfd_elf_fix_symbol_flags (struct elf_link_hash_entry *h,
|
|||
/* If this is a weak defined symbol in a dynamic object, and we know
|
||||
the real definition in the dynamic object, copy interesting flags
|
||||
over to the real definition. */
|
||||
if (h->weakdef != NULL)
|
||||
if (h->u.weakdef != NULL)
|
||||
{
|
||||
struct elf_link_hash_entry *weakdef;
|
||||
|
||||
weakdef = h->weakdef;
|
||||
weakdef = h->u.weakdef;
|
||||
if (h->root.type == bfd_link_hash_indirect)
|
||||
h = (struct elf_link_hash_entry *) h->root.u.i.link;
|
||||
|
||||
|
@ -2211,7 +2210,7 @@ _bfd_elf_fix_symbol_flags (struct elf_link_hash_entry *h,
|
|||
don't do anything special. See the longer description in
|
||||
_bfd_elf_adjust_dynamic_symbol, below. */
|
||||
if (weakdef->def_regular)
|
||||
h->weakdef = NULL;
|
||||
h->u.weakdef = NULL;
|
||||
else
|
||||
{
|
||||
const struct elf_backend_data *bed;
|
||||
|
@ -2268,7 +2267,7 @@ _bfd_elf_adjust_dynamic_symbol (struct elf_link_hash_entry *h, void *data)
|
|||
&& (h->def_regular
|
||||
|| !h->def_dynamic
|
||||
|| (!h->ref_regular
|
||||
&& (h->weakdef == NULL || h->weakdef->dynindx == -1))))
|
||||
&& (h->u.weakdef == NULL || h->u.weakdef->dynindx == -1))))
|
||||
{
|
||||
h->plt = elf_hash_table (eif->info)->init_offset;
|
||||
return TRUE;
|
||||
|
@ -2313,15 +2312,15 @@ _bfd_elf_adjust_dynamic_symbol (struct elf_link_hash_entry *h, void *data)
|
|||
wind up at different memory locations. The tzset call will set
|
||||
_timezone, leaving timezone unchanged. */
|
||||
|
||||
if (h->weakdef != NULL)
|
||||
if (h->u.weakdef != NULL)
|
||||
{
|
||||
/* If we get to this point, we know there is an implicit
|
||||
reference by a regular object file via the weak symbol H.
|
||||
FIXME: Is this really true? What if the traversal finds
|
||||
H->WEAKDEF before it finds H? */
|
||||
h->weakdef->ref_regular = 1;
|
||||
H->U.WEAKDEF before it finds H? */
|
||||
h->u.weakdef->ref_regular = 1;
|
||||
|
||||
if (! _bfd_elf_adjust_dynamic_symbol (h->weakdef, eif))
|
||||
if (! _bfd_elf_adjust_dynamic_symbol (h->u.weakdef, eif))
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
@ -3594,7 +3593,7 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
|
|||
&& (flags & BSF_WEAK) != 0
|
||||
&& ELF_ST_TYPE (isym->st_info) != STT_FUNC
|
||||
&& is_elf_hash_table (hash_table)
|
||||
&& h->weakdef == NULL)
|
||||
&& h->u.weakdef == NULL)
|
||||
{
|
||||
/* Keep a list of all weak defined non function symbols from
|
||||
a dynamic object, using the weakdef field. Later in this
|
||||
|
@ -3608,7 +3607,7 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
|
|||
dynamic object, and we will be using that previous
|
||||
definition anyhow. */
|
||||
|
||||
h->weakdef = weaks;
|
||||
h->u.weakdef = weaks;
|
||||
weaks = h;
|
||||
new_weakdef = TRUE;
|
||||
}
|
||||
|
@ -3773,9 +3772,9 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
|
|||
h->def_dynamic = 1;
|
||||
if (h->def_regular
|
||||
|| h->ref_regular
|
||||
|| (h->weakdef != NULL
|
||||
|| (h->u.weakdef != NULL
|
||||
&& ! new_weakdef
|
||||
&& h->weakdef->dynindx != -1))
|
||||
&& h->u.weakdef->dynindx != -1))
|
||||
dynsym = TRUE;
|
||||
}
|
||||
|
||||
|
@ -3808,11 +3807,11 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
|
|||
{
|
||||
if (! bfd_elf_link_record_dynamic_symbol (info, h))
|
||||
goto error_free_vers;
|
||||
if (h->weakdef != NULL
|
||||
if (h->u.weakdef != NULL
|
||||
&& ! new_weakdef
|
||||
&& h->weakdef->dynindx == -1)
|
||||
&& h->u.weakdef->dynindx == -1)
|
||||
{
|
||||
if (! bfd_elf_link_record_dynamic_symbol (info, h->weakdef))
|
||||
if (! bfd_elf_link_record_dynamic_symbol (info, h->u.weakdef))
|
||||
goto error_free_vers;
|
||||
}
|
||||
}
|
||||
|
@ -3977,8 +3976,8 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
|
|||
size_t i, j, idx;
|
||||
|
||||
hlook = weaks;
|
||||
weaks = hlook->weakdef;
|
||||
hlook->weakdef = NULL;
|
||||
weaks = hlook->u.weakdef;
|
||||
hlook->u.weakdef = NULL;
|
||||
|
||||
BFD_ASSERT (hlook->root.type == bfd_link_hash_defined
|
||||
|| hlook->root.type == bfd_link_hash_defweak
|
||||
|
@ -4029,7 +4028,7 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
|
|||
break;
|
||||
else if (h != hlook)
|
||||
{
|
||||
hlook->weakdef = h;
|
||||
hlook->u.weakdef = h;
|
||||
|
||||
/* If the weak definition is in the list of dynamic
|
||||
symbols, make sure the real definition is put
|
||||
|
@ -4472,7 +4471,7 @@ elf_collect_hash_codes (struct elf_link_hash_entry *h, void *data)
|
|||
|
||||
/* And store it in the struct so that we can put it in the hash table
|
||||
later. */
|
||||
h->elf_hash_value = ha;
|
||||
h->u.elf_hash_value = ha;
|
||||
|
||||
if (alc != NULL)
|
||||
free (alc);
|
||||
|
@ -6230,7 +6229,7 @@ elf_link_output_extsym (struct elf_link_hash_entry *h, void *data)
|
|||
bed->s->swap_symbol_out (finfo->output_bfd, &sym, esym, 0);
|
||||
|
||||
bucketcount = elf_hash_table (finfo->info)->bucketcount;
|
||||
bucket = h->elf_hash_value % bucketcount;
|
||||
bucket = h->u.elf_hash_value % bucketcount;
|
||||
hash_entry_size
|
||||
= elf_section_data (finfo->hash_sec)->this_hdr.sh_entsize;
|
||||
bucketpos = ((bfd_byte *) finfo->hash_sec->contents
|
||||
|
@ -8565,26 +8564,26 @@ elf_gc_propagate_vtable_entries_used (struct elf_link_hash_entry *h, void *okp)
|
|||
h = (struct elf_link_hash_entry *) h->root.u.i.link;
|
||||
|
||||
/* Those that are not vtables. */
|
||||
if (h->vtable_parent == NULL)
|
||||
if (h->vtable == NULL || h->vtable->parent == NULL)
|
||||
return TRUE;
|
||||
|
||||
/* Those vtables that do not have parents, we cannot merge. */
|
||||
if (h->vtable_parent == (struct elf_link_hash_entry *) -1)
|
||||
if (h->vtable->parent == (struct elf_link_hash_entry *) -1)
|
||||
return TRUE;
|
||||
|
||||
/* If we've already been done, exit. */
|
||||
if (h->vtable_entries_used && h->vtable_entries_used[-1])
|
||||
if (h->vtable->used && h->vtable->used[-1])
|
||||
return TRUE;
|
||||
|
||||
/* Make sure the parent's table is up to date. */
|
||||
elf_gc_propagate_vtable_entries_used (h->vtable_parent, okp);
|
||||
elf_gc_propagate_vtable_entries_used (h->vtable->parent, okp);
|
||||
|
||||
if (h->vtable_entries_used == NULL)
|
||||
if (h->vtable->used == NULL)
|
||||
{
|
||||
/* None of this table's entries were referenced. Re-use the
|
||||
parent's table. */
|
||||
h->vtable_entries_used = h->vtable_parent->vtable_entries_used;
|
||||
h->vtable_entries_size = h->vtable_parent->vtable_entries_size;
|
||||
h->vtable->used = h->vtable->parent->vtable->used;
|
||||
h->vtable->size = h->vtable->parent->vtable->size;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -8592,9 +8591,9 @@ elf_gc_propagate_vtable_entries_used (struct elf_link_hash_entry *h, void *okp)
|
|||
bfd_boolean *cu, *pu;
|
||||
|
||||
/* Or the parent's entries into ours. */
|
||||
cu = h->vtable_entries_used;
|
||||
cu = h->vtable->used;
|
||||
cu[-1] = TRUE;
|
||||
pu = h->vtable_parent->vtable_entries_used;
|
||||
pu = h->vtable->parent->vtable->used;
|
||||
if (pu != NULL)
|
||||
{
|
||||
const struct elf_backend_data *bed;
|
||||
|
@ -8602,7 +8601,7 @@ elf_gc_propagate_vtable_entries_used (struct elf_link_hash_entry *h, void *okp)
|
|||
|
||||
bed = get_elf_backend_data (h->root.u.def.section->owner);
|
||||
log_file_align = bed->s->log_file_align;
|
||||
n = h->vtable_parent->vtable_entries_size >> log_file_align;
|
||||
n = h->vtable->parent->vtable->size >> log_file_align;
|
||||
while (n--)
|
||||
{
|
||||
if (*pu)
|
||||
|
@ -8630,7 +8629,7 @@ elf_gc_smash_unused_vtentry_relocs (struct elf_link_hash_entry *h, void *okp)
|
|||
|
||||
/* Take care of both those symbols that do not describe vtables as
|
||||
well as those that are not loaded. */
|
||||
if (h->vtable_parent == NULL)
|
||||
if (h->vtable == NULL || h->vtable->parent == NULL)
|
||||
return TRUE;
|
||||
|
||||
BFD_ASSERT (h->root.type == bfd_link_hash_defined
|
||||
|
@ -8652,11 +8651,11 @@ elf_gc_smash_unused_vtentry_relocs (struct elf_link_hash_entry *h, void *okp)
|
|||
if (rel->r_offset >= hstart && rel->r_offset < hend)
|
||||
{
|
||||
/* If the entry is in use, do nothing. */
|
||||
if (h->vtable_entries_used
|
||||
&& (rel->r_offset - hstart) < h->vtable_entries_size)
|
||||
if (h->vtable->used
|
||||
&& (rel->r_offset - hstart) < h->vtable->size)
|
||||
{
|
||||
bfd_vma entry = (rel->r_offset - hstart) >> log_file_align;
|
||||
if (h->vtable_entries_used[entry])
|
||||
if (h->vtable->used[entry])
|
||||
continue;
|
||||
}
|
||||
/* Otherwise, kill it. */
|
||||
|
@ -8799,6 +8798,12 @@ bfd_elf_gc_record_vtinherit (bfd *abfd,
|
|||
return FALSE;
|
||||
|
||||
win:
|
||||
if (!child->vtable)
|
||||
{
|
||||
child->vtable = bfd_zalloc (abfd, sizeof (*child->vtable));
|
||||
if (!child->vtable)
|
||||
return FALSE;
|
||||
}
|
||||
if (!h)
|
||||
{
|
||||
/* This *should* only be the absolute section. It could potentially
|
||||
|
@ -8806,10 +8811,10 @@ bfd_elf_gc_record_vtinherit (bfd *abfd,
|
|||
would be bad. It isn't worth paging in the local symbols to be
|
||||
sure though; that case should simply be handled by the assembler. */
|
||||
|
||||
child->vtable_parent = (struct elf_link_hash_entry *) -1;
|
||||
child->vtable->parent = (struct elf_link_hash_entry *) -1;
|
||||
}
|
||||
else
|
||||
child->vtable_parent = h;
|
||||
child->vtable->parent = h;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -8825,10 +8830,17 @@ bfd_elf_gc_record_vtentry (bfd *abfd ATTRIBUTE_UNUSED,
|
|||
const struct elf_backend_data *bed = get_elf_backend_data (abfd);
|
||||
unsigned int log_file_align = bed->s->log_file_align;
|
||||
|
||||
if (addend >= h->vtable_entries_size)
|
||||
if (!h->vtable)
|
||||
{
|
||||
h->vtable = bfd_zalloc (abfd, sizeof (*h->vtable));
|
||||
if (!h->vtable)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (addend >= h->vtable->size)
|
||||
{
|
||||
size_t size, bytes, file_align;
|
||||
bfd_boolean *ptr = h->vtable_entries_used;
|
||||
bfd_boolean *ptr = h->vtable->used;
|
||||
|
||||
/* While the symbol is undefined, we have to be prepared to handle
|
||||
a zero size. */
|
||||
|
@ -8859,7 +8871,7 @@ bfd_elf_gc_record_vtentry (bfd *abfd ATTRIBUTE_UNUSED,
|
|||
{
|
||||
size_t oldbytes;
|
||||
|
||||
oldbytes = (((h->vtable_entries_size >> log_file_align) + 1)
|
||||
oldbytes = (((h->vtable->size >> log_file_align) + 1)
|
||||
* sizeof (bfd_boolean));
|
||||
memset (((char *) ptr) + oldbytes, 0, bytes - oldbytes);
|
||||
}
|
||||
|
@ -8871,11 +8883,11 @@ bfd_elf_gc_record_vtentry (bfd *abfd ATTRIBUTE_UNUSED,
|
|||
return FALSE;
|
||||
|
||||
/* And arrange for that done flag to be at index -1. */
|
||||
h->vtable_entries_used = ptr + 1;
|
||||
h->vtable_entries_size = size;
|
||||
h->vtable->used = ptr + 1;
|
||||
h->vtable->size = size;
|
||||
}
|
||||
|
||||
h->vtable_entries_used[addend >> log_file_align] = TRUE;
|
||||
h->vtable->used[addend >> log_file_align] = TRUE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
|
|
@ -2838,12 +2838,12 @@ elfNN_ia64_adjust_dynamic_symbol (info, h)
|
|||
/* If this is a weak symbol, and there is a real definition, the
|
||||
processor independent code will have arranged for us to see the
|
||||
real definition first, and we can just use the same value. */
|
||||
if (h->weakdef != NULL)
|
||||
if (h->u.weakdef != NULL)
|
||||
{
|
||||
BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->weakdef->root.u.def.value;
|
||||
BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->u.weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->u.weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->u.weakdef->root.u.def.value;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
@ -5668,7 +5668,7 @@ _bfd_mips_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
|
|||
/* Make sure we know what is going on here. */
|
||||
BFD_ASSERT (dynobj != NULL
|
||||
&& (h->needs_plt
|
||||
|| h->weakdef != NULL
|
||||
|| h->u.weakdef != NULL
|
||||
|| (h->def_dynamic
|
||||
&& h->ref_regular
|
||||
&& !h->def_regular)));
|
||||
|
@ -5734,12 +5734,12 @@ _bfd_mips_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
|
|||
/* If this is a weak symbol, and there is a real definition, the
|
||||
processor independent code will have arranged for us to see the
|
||||
real definition first, and we can just use the same value. */
|
||||
if (h->weakdef != NULL)
|
||||
if (h->u.weakdef != NULL)
|
||||
{
|
||||
BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->weakdef->root.u.def.value;
|
||||
BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
|
||||
|| h->u.weakdef->root.type == bfd_link_hash_defweak);
|
||||
h->root.u.def.section = h->u.weakdef->root.u.def.section;
|
||||
h->root.u.def.value = h->u.weakdef->root.u.def.value;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
26
bfd/linker.c
26
bfd/linker.c
|
@ -455,7 +455,7 @@ _bfd_link_hash_newfunc (struct bfd_hash_entry *entry,
|
|||
|
||||
/* Initialize the local fields. */
|
||||
h->type = bfd_link_hash_new;
|
||||
h->und_next = NULL;
|
||||
h->u.undef.next = NULL;
|
||||
}
|
||||
|
||||
return entry;
|
||||
|
@ -616,9 +616,9 @@ void
|
|||
bfd_link_add_undef (struct bfd_link_hash_table *table,
|
||||
struct bfd_link_hash_entry *h)
|
||||
{
|
||||
BFD_ASSERT (h->und_next == NULL);
|
||||
BFD_ASSERT (h->u.undef.next == NULL);
|
||||
if (table->undefs_tail != NULL)
|
||||
table->undefs_tail->und_next = h;
|
||||
table->undefs_tail->u.undef.next = h;
|
||||
if (table->undefs == NULL)
|
||||
table->undefs = h;
|
||||
table->undefs_tail = h;
|
||||
|
@ -990,9 +990,9 @@ _bfd_generic_link_add_archive_symbols
|
|||
us to lose track of whether the symbol has been
|
||||
referenced). */
|
||||
if (*pundef != info->hash->undefs_tail)
|
||||
*pundef = (*pundef)->und_next;
|
||||
*pundef = (*pundef)->u.undef.next;
|
||||
else
|
||||
pundef = &(*pundef)->und_next;
|
||||
pundef = &(*pundef)->u.undef.next;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -1015,7 +1015,7 @@ _bfd_generic_link_add_archive_symbols
|
|||
}
|
||||
if (arh == NULL)
|
||||
{
|
||||
pundef = &(*pundef)->und_next;
|
||||
pundef = &(*pundef)->u.undef.next;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
@ -1064,7 +1064,7 @@ _bfd_generic_link_add_archive_symbols
|
|||
}
|
||||
}
|
||||
|
||||
pundef = &(*pundef)->und_next;
|
||||
pundef = &(*pundef)->u.undef.next;
|
||||
}
|
||||
|
||||
archive_hash_table_free (&arsym_hash);
|
||||
|
@ -1694,8 +1694,8 @@ _bfd_generic_link_add_one_symbol (struct bfd_link_info *info,
|
|||
|
||||
case REF:
|
||||
/* A reference to a defined symbol. */
|
||||
if (h->und_next == NULL && info->hash->undefs_tail != h)
|
||||
h->und_next = h;
|
||||
if (h->u.undef.next == NULL && info->hash->undefs_tail != h)
|
||||
h->u.undef.next = h;
|
||||
break;
|
||||
|
||||
case BIG:
|
||||
|
@ -1881,8 +1881,8 @@ _bfd_generic_link_add_one_symbol (struct bfd_link_info *info,
|
|||
|
||||
case REFC:
|
||||
/* A reference to an indirect symbol. */
|
||||
if (h->und_next == NULL && info->hash->undefs_tail != h)
|
||||
h->und_next = h;
|
||||
if (h->u.undef.next == NULL && info->hash->undefs_tail != h)
|
||||
h->u.undef.next = h;
|
||||
h = h->u.i.link;
|
||||
cycle = TRUE;
|
||||
break;
|
||||
|
@ -1897,10 +1897,10 @@ _bfd_generic_link_add_one_symbol (struct bfd_link_info *info,
|
|||
case CWARN:
|
||||
/* Warn if this symbol has been referenced already,
|
||||
otherwise add a warning. A symbol has been referenced if
|
||||
the und_next field is not NULL, or it is the tail of the
|
||||
the u.undef.next field is not NULL, or it is the tail of the
|
||||
undefined symbol list. The REF case above helps to
|
||||
ensure this. */
|
||||
if (h->und_next != NULL || info->hash->undefs_tail == h)
|
||||
if (h->u.undef.next != NULL || info->hash->undefs_tail == h)
|
||||
{
|
||||
if (! (*info->callbacks->warning) (info, string, h->root.string,
|
||||
hash_entry_bfd (h), NULL, 0))
|
||||
|
|
|
@ -1825,7 +1825,7 @@ xcoff_link_add_symbols (abfd, info)
|
|||
section = bfd_und_section_ptr;
|
||||
value = 0;
|
||||
}
|
||||
else if ((*sym_hash)->root.und_next != NULL
|
||||
else if ((*sym_hash)->root.u.undef.next != NULL
|
||||
|| info->hash->undefs_tail == &(*sym_hash)->root)
|
||||
{
|
||||
/* This symbol has been referenced. In this
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2004-09-17 Alan Modra <amodra@bigpond.net.au>
|
||||
|
||||
* bfdlink.h (struct bfd_link_hash_entry): Move und_next into elements
|
||||
of union.
|
||||
|
||||
2004-09-13 Aaron W. LaFramboise <aaronavay62@aaronwl.com>
|
||||
|
||||
* libiberty.h (basename): Prototype for __MINGW32__.
|
||||
|
|
|
@ -85,26 +85,6 @@ struct bfd_link_hash_entry
|
|||
/* Type of this entry. */
|
||||
enum bfd_link_hash_type type;
|
||||
|
||||
/* Undefined and common symbols are kept in a linked list through
|
||||
this field. This field is not in the union because that would
|
||||
force us to remove entries from the list when we changed their
|
||||
type, which would force the list to be doubly linked, which would
|
||||
waste more memory. When an undefined or common symbol is
|
||||
created, it should be added to this list, the head of which is in
|
||||
the link hash table itself. As symbols are defined, they need
|
||||
not be removed from the list; anything which reads the list must
|
||||
doublecheck the symbol type.
|
||||
|
||||
Weak symbols are not kept on this list.
|
||||
|
||||
Defined and defweak symbols use this field as a reference marker.
|
||||
If the field is not NULL, or this structure is the tail of the
|
||||
undefined symbol list, the symbol has been referenced. If the
|
||||
symbol is undefined and becomes defined, this field will
|
||||
automatically be non-NULL since the symbol will have been on the
|
||||
undefined symbol list. */
|
||||
struct bfd_link_hash_entry *und_next;
|
||||
|
||||
/* A union of information depending upon the type. */
|
||||
union
|
||||
{
|
||||
|
@ -112,23 +92,46 @@ struct bfd_link_hash_entry
|
|||
/* bfd_link_hash_undefined, bfd_link_hash_undefweak. */
|
||||
struct
|
||||
{
|
||||
/* Undefined and common symbols are kept in a linked list through
|
||||
this field. This field is present in all of the union element
|
||||
so that we don't need to remove entries from the list when we
|
||||
change their type. Removing entries would either require the
|
||||
list to be doubly linked, which would waste more memory, or
|
||||
require a traversal. When an undefined or common symbol is
|
||||
created, it should be added to this list, the head of which is in
|
||||
the link hash table itself. As symbols are defined, they need
|
||||
not be removed from the list; anything which reads the list must
|
||||
doublecheck the symbol type.
|
||||
|
||||
Weak symbols are not kept on this list.
|
||||
|
||||
Defined and defweak symbols use this field as a reference marker.
|
||||
If the field is not NULL, or this structure is the tail of the
|
||||
undefined symbol list, the symbol has been referenced. If the
|
||||
symbol is undefined and becomes defined, this field will
|
||||
automatically be non-NULL since the symbol will have been on the
|
||||
undefined symbol list. */
|
||||
struct bfd_link_hash_entry *next;
|
||||
bfd *abfd; /* BFD symbol was found in. */
|
||||
} undef;
|
||||
/* bfd_link_hash_defined, bfd_link_hash_defweak. */
|
||||
struct
|
||||
{
|
||||
bfd_vma value; /* Symbol value. */
|
||||
struct bfd_link_hash_entry *next;
|
||||
asection *section; /* Symbol section. */
|
||||
bfd_vma value; /* Symbol value. */
|
||||
} def;
|
||||
/* bfd_link_hash_indirect, bfd_link_hash_warning. */
|
||||
struct
|
||||
{
|
||||
struct bfd_link_hash_entry *next;
|
||||
struct bfd_link_hash_entry *link; /* Real symbol. */
|
||||
const char *warning; /* Warning (bfd_link_hash_warning only). */
|
||||
} i;
|
||||
/* bfd_link_hash_common. */
|
||||
struct
|
||||
{
|
||||
struct bfd_link_hash_entry *next;
|
||||
/* The linker needs to know three things about common
|
||||
symbols: the size, the alignment, and the section in
|
||||
which the symbol should be placed. We store the size
|
||||
|
@ -138,12 +141,12 @@ struct bfd_link_hash_entry
|
|||
directly because we don't want to increase the size of
|
||||
the union; this structure is a major space user in the
|
||||
linker. */
|
||||
bfd_size_type size; /* Common symbol size. */
|
||||
struct bfd_link_hash_common_entry
|
||||
{
|
||||
unsigned int alignment_power; /* Alignment. */
|
||||
asection *section; /* Symbol section. */
|
||||
} *p;
|
||||
bfd_size_type size; /* Common symbol size. */
|
||||
} c;
|
||||
} u;
|
||||
};
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
2004-09-17 Alan Modra <amodra@bigpond.net.au>
|
||||
|
||||
* ldexp.c (fold_name): Update u.undef.next refs.
|
||||
* emultempl/pe.em: Likewise.
|
||||
* emultempl/sunos.em: Likewise.
|
||||
|
||||
2004-09-17 Alan Modra <amodra@bigpond.net.au>
|
||||
|
||||
* Makefile.am: Run "make dep-am".
|
||||
|
|
|
@ -773,7 +773,7 @@ pe_fixup_stdcalls (void)
|
|||
if (pe_dll_extra_pe_debug)
|
||||
printf ("%s\n", __FUNCTION__);
|
||||
|
||||
for (undef = link_info.hash->undefs; undef; undef=undef->und_next)
|
||||
for (undef = link_info.hash->undefs; undef; undef=undef->u.undef.next)
|
||||
if (undef->type == bfd_link_hash_undefined)
|
||||
{
|
||||
char* at = strchr (undef->root.string, '@');
|
||||
|
@ -865,7 +865,7 @@ pe_find_data_imports (void)
|
|||
if (link_info.pei386_auto_import == 0)
|
||||
return;
|
||||
|
||||
for (undef = link_info.hash->undefs; undef; undef=undef->und_next)
|
||||
for (undef = link_info.hash->undefs; undef; undef=undef->u.undef.next)
|
||||
{
|
||||
if (undef->type == bfd_link_hash_undefined)
|
||||
{
|
||||
|
@ -945,7 +945,7 @@ gld_${EMULATION_NAME}_after_open (void)
|
|||
|
||||
printf ("%s()\n", __FUNCTION__);
|
||||
|
||||
for (sym = link_info.hash->undefs; sym; sym=sym->und_next)
|
||||
for (sym = link_info.hash->undefs; sym; sym=sym->u.undef.next)
|
||||
printf ("-%s\n", sym->root.string);
|
||||
bfd_hash_traverse (&link_info.hash->table, pr_sym, NULL);
|
||||
|
||||
|
@ -1066,7 +1066,7 @@ gld_${EMULATION_NAME}_after_open (void)
|
|||
|
||||
relocs = (arelent **) xmalloc ((size_t) relsize);
|
||||
nrelocs = bfd_canonicalize_reloc (is->the_bfd, sec,
|
||||
relocs, symbols);
|
||||
relocs, symbols);
|
||||
if (nrelocs < 0)
|
||||
{
|
||||
free (relocs);
|
||||
|
|
|
@ -671,7 +671,7 @@ gld${EMULATION_NAME}_before_allocation (void)
|
|||
{
|
||||
struct bfd_link_hash_entry *h;
|
||||
|
||||
for (h = link_info.hash->undefs; h != NULL; h = h->und_next)
|
||||
for (h = link_info.hash->undefs; h != NULL; h = h->u.undef.next)
|
||||
{
|
||||
if (h->type == bfd_link_hash_undefined
|
||||
&& h->u.undef.abfd != NULL
|
||||
|
|
|
@ -577,7 +577,7 @@ fold_name (etree_type *tree,
|
|||
{
|
||||
h->type = bfd_link_hash_undefined;
|
||||
h->u.undef.abfd = NULL;
|
||||
if (h->und_next == NULL)
|
||||
if (h->u.undef.next == NULL)
|
||||
bfd_link_add_undef (link_info.hash, h);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue