diff options
author | Alan Modra <amodra@gmail.com> | 2013-11-06 10:20:52 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2013-11-15 16:30:18 +1030 |
commit | 4e525783ce6ccc27cf4057dfb60d90eec6645a6a (patch) | |
tree | 9e9629f308b671b12cdb4a4ff782478affc39f2a | |
parent | 3943c5e736b0efccbdc881ddfe589ff86d7e78e2 (diff) | |
download | ppe42-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/ChangeLog | 10 | ||||
-rw-r--r-- | bfd/elf64-ppc.c | 24 |
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) { |