* elf64-ppc.c (ppc64_elf_layout_multitoc): Don't merge local got ents.

This commit is contained in:
Alan Modra 2010-02-09 11:54:52 +00:00
parent f961d9dde2
commit d0fae19df2
2 changed files with 19 additions and 41 deletions

View file

@ -4,6 +4,8 @@
unsigned char. Update variables and code using them throughout file.
(struct ppc_link_hash_entry): Likewise for tls_mask.
* elf64-ppc.c (ppc64_elf_layout_multitoc): Don't merge local got ents.
2010-02-08 David S. Miller <davem@davemloft.net>
* elfxx-sparc.h (struct _bfd_sparc_elf_link_hash_table): Remove sgot,

View file

@ -9922,30 +9922,7 @@ ppc64_elf_layout_multitoc (struct bfd_link_info *info)
htab->multi_toc_needed = htab->toc_curr != elf_gp (info->output_bfd);
/* Merge local got entries within a toc group. */
for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
{
struct got_entry **lgot_ents;
struct got_entry **end_lgot_ents;
Elf_Internal_Shdr *symtab_hdr;
bfd_size_type locsymcount;
if (!is_ppc64_elf (ibfd))
continue;
lgot_ents = elf_local_got_ents (ibfd);
if (!lgot_ents)
continue;
symtab_hdr = &elf_symtab_hdr (ibfd);
locsymcount = symtab_hdr->sh_info;
end_lgot_ents = lgot_ents + locsymcount;
for (; lgot_ents < end_lgot_ents; ++lgot_ents)
merge_got_entries (lgot_ents);
}
/* And the same for global sym got entries. */
/* Merge global sym got entries within a toc group. */
elf_link_hash_traverse (&htab->elf, merge_global_got, info);
/* And tlsld_got. */
@ -10033,23 +10010,22 @@ ppc64_elf_layout_multitoc (struct bfd_link_info *info)
struct got_entry *ent;
for (ent = *lgot_ents; ent != NULL; ent = ent->next)
if (!ent->is_indirect)
{
unsigned int num = 1;
ent->got.offset = s->size;
if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
num = 2;
s->size += num * 8;
if (info->shared)
srel->size += num * sizeof (Elf64_External_Rela);
else if ((*lgot_masks & PLT_IFUNC) != 0)
{
htab->reliplt->size
+= num * sizeof (Elf64_External_Rela);
htab->got_reli_size
+= num * sizeof (Elf64_External_Rela);
}
}
{
unsigned int num = 1;
ent->got.offset = s->size;
if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
num = 2;
s->size += num * 8;
if (info->shared)
srel->size += num * sizeof (Elf64_External_Rela);
else if ((*lgot_masks & PLT_IFUNC) != 0)
{
htab->reliplt->size
+= num * sizeof (Elf64_External_Rela);
htab->got_reli_size
+= num * sizeof (Elf64_External_Rela);
}
}
}
}