aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog2
-rw-r--r--bfd/elf64-ppc.c58
2 files changed, 19 insertions, 41 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index d85fc45..97881de 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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,
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index c6a238f..f44c733 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -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);
+ }
+ }
}
}