* elflink.c (elf_link_add_object_symbols): Save and restore
	warning sym's linked sym.
This commit is contained in:
Alan Modra 2006-03-17 03:19:56 +00:00
parent cb4c78d64a
commit 2de922512d
2 changed files with 31 additions and 3 deletions

View File

@ -1,3 +1,9 @@
2006-03-17 Alan Modra <amodra@bigpond.net.au>
PR 2434
* elflink.c (elf_link_add_object_symbols): Save and restore
warning sym's linked sym.
2006-03-16 Alan Modra <amodra@bigpond.net.au>
PR 2434

View File

@ -3457,9 +3457,15 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
for (entsize = 0, i = 0; i < htab->root.table.size; i++)
{
struct bfd_hash_entry *p;
struct elf_link_hash_entry *h;
for (p = htab->root.table.table[i]; p != NULL; p = p->next)
entsize += htab->root.table.entsize;
{
h = (struct elf_link_hash_entry *) p;
entsize += htab->root.table.entsize;
if (h->root.type == bfd_link_hash_warning)
entsize += htab->root.table.entsize;
}
}
tabsize = htab->root.table.size * sizeof (struct bfd_hash_entry *);
@ -3487,11 +3493,18 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
for (i = 0; i < htab->root.table.size; i++)
{
struct bfd_hash_entry *p;
struct elf_link_hash_entry *h;
for (p = htab->root.table.table[i]; p != NULL; p = p->next)
{
memcpy (old_ent, p, htab->root.table.entsize);
old_ent = (char *) old_ent + htab->root.table.entsize;
h = (struct elf_link_hash_entry *) p;
if (h->root.type == bfd_link_hash_warning)
{
memcpy (old_ent, h->root.u.i.link, htab->root.table.entsize);
old_ent = (char *) old_ent + htab->root.table.entsize;
}
}
}
}
@ -4124,10 +4137,19 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
for (p = htab->root.table.table[i]; p != NULL; p = p->next)
{
h = (struct elf_link_hash_entry *) p;
if (h->root.type == bfd_link_hash_warning)
h = (struct elf_link_hash_entry *) h->root.u.i.link;
if (h->dynindx >= old_dynsymcount)
_bfd_elf_strtab_delref (htab->dynstr, h->dynstr_index);
memcpy (p, old_ent, htab->root.table.entsize);
old_ent = (char *) old_ent + htab->root.table.entsize;
h = (struct elf_link_hash_entry *) p;
if (h->root.type == bfd_link_hash_warning)
{
memcpy (h->root.u.i.link, old_ent, htab->root.table.entsize);
old_ent = (char *) old_ent + htab->root.table.entsize;
}
}
}
@ -4138,7 +4160,7 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
free (nondeflt_vers);
return TRUE;
}
if (old_tab != NULL)
{
free (old_tab);
@ -9149,7 +9171,7 @@ bfd_elf_gc_sections (bfd *abfd, struct bfd_link_info *info)
/* Keep .gcc_except_table.* if the associated .text.* is
marked. This isn't very nice, but the proper solution,
splitting .eh_frame up and using comdat doesn't pan out
splitting .eh_frame up and using comdat doesn't pan out
easily due to needing special relocs to handle the
difference of two symbols in separate sections.
Don't keep code sections referenced by .eh_frame. */