summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2013-11-06 10:20:52 +1030
committerAlan Modra <amodra@gmail.com>2013-11-15 16:30:18 +1030
commit4e525783ce6ccc27cf4057dfb60d90eec6645a6a (patch)
tree9e9629f308b671b12cdb4a4ff782478affc39f2a
parent3943c5e736b0efccbdc881ddfe589ff86d7e78e2 (diff)
downloadppe42-binutils-4e525783ce6ccc27cf4057dfb60d90eec6645a6a.tar.gz
ppe42-binutils-4e525783ce6ccc27cf4057dfb60d90eec6645a6a.zip
Correct elf64-ppc.c handling of protected symbols
(cherry picked from commit afe397ea85a3d09d936c93328a1f6bf640577cf3)
-rw-r--r--bfd/ChangeLog10
-rw-r--r--bfd/elf64-ppc.c24
2 files changed, 20 insertions, 14 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index fd128199dd..10e4038884 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,6 +1,16 @@
2013-11-15 Alan Modra <amodra@gmail.com>
Apply changes from mainline to 2.24
+ 2013-11-11 Ulrich Weigand <uweigand@de.ibm.com>
+ * elf64-ppc.c (ppc64_elf_edit_toc): Use SYMBOL_REFERENCES_LOCAL
+ here, not SYMBOL_CALLS_LOCAL.
+ (ppc64_elf_relocate_section): Likewise.
+ (size_global_entry_stubs): Set undefined symbols on their global
+ entry stubs here..
+ (build_global_entry_stubs): ..rather than here.
+ (ppc64_elf_build_stubs): Don't reset glink->size before calling
+ build_global_entry_stubs.
+
2013-11-05 Alan Modra <amodra@gmail.com>
* elf64-ppc.c (ppc64_elf_func_desc_adjust): Make .TOC. defined and
hidden.
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index 136887f25e..44af20ad9b 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -8698,7 +8698,7 @@ ppc64_elf_edit_toc (struct bfd_link_info *info)
|| discarded_section (sym_sec))
continue;
- if (!SYMBOL_CALLS_LOCAL (info, h))
+ if (!SYMBOL_REFERENCES_LOCAL (info, h))
continue;
if (h != NULL)
@@ -9545,7 +9545,13 @@ size_global_entry_stubs (struct elf_link_hash_entry *h, void *inf)
if (pent->plt.offset != (bfd_vma) -1
&& pent->addend == 0)
{
+ /* For ELFv2, if this symbol is not defined in a regular file
+ and we are not generating a shared library or pie, then we
+ need to define the symbol in the executable on a call stub.
+ This is to avoid text relocations. */
s->size = (s->size + 15) & -16;
+ h->root.u.def.section = s;
+ h->root.u.def.value = s->size;
s->size += 16;
break;
}
@@ -12381,13 +12387,6 @@ build_global_entry_stubs (struct elf_link_hash_entry *h, void *inf)
asection *plt;
bfd_vma off;
- /* For ELFv2, if this symbol is not defined in a regular file
- and we are not generating a shared library or pie, then we
- need to define the symbol in the executable on a call stub.
- This is to avoid text relocations. */
- h->root.u.def.section = s;
- h->root.u.def.value = s->size;
- s->size += 16;
p = s->contents + h->root.u.def.value;
plt = htab->elf.splt;
if (!htab->elf.dynamic_sections_created
@@ -12583,10 +12582,7 @@ ppc64_elf_build_stubs (bfd_boolean emit_stub_syms,
/* Build .glink global entry stubs. */
if (htab->glink->size > htab->glink->rawsize)
- {
- htab->glink->size = (htab->glink->rawsize + 15) & -16;
- elf_link_hash_traverse (&htab->elf, build_global_entry_stubs, info);
- }
+ elf_link_hash_traverse (&htab->elf, build_global_entry_stubs, info);
}
if (htab->brlt->size != 0)
@@ -13854,7 +13850,7 @@ ppc64_elf_relocate_section (bfd *output_bfd,
if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared,
&h->elf)
|| (info->shared
- && SYMBOL_CALLS_LOCAL (info, &h->elf)))
+ && SYMBOL_REFERENCES_LOCAL (info, &h->elf)))
/* This is actually a static link, or it is a
-Bsymbolic link and the symbol is defined
locally, or the symbol was forced to be local
@@ -14239,7 +14235,7 @@ ppc64_elf_relocate_section (bfd *output_bfd,
if (skip)
memset (&outrel, 0, sizeof outrel);
- else if (!SYMBOL_CALLS_LOCAL (info, &h->elf)
+ else if (!SYMBOL_REFERENCES_LOCAL (info, &h->elf)
&& !is_opd
&& r_type != R_PPC64_TOC)
{
OpenPOWER on IntegriCloud