Correct elf64-ppc.c handling of protected symbols
authorAlan Modra <amodra@gmail.com>
Tue, 5 Nov 2013 23:50:52 +0000 (10:20 +1030)
committerAlan Modra <amodra@gmail.com>
Fri, 15 Nov 2013 06:00:18 +0000 (16:30 +1030)
(cherry picked from commit afe397ea85a3d09d936c93328a1f6bf640577cf3)

bfd/ChangeLog
bfd/elf64-ppc.c

index fd12819..10e4038 100644 (file)
@@ -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.
index 136887f..44af20a 100644 (file)
@@ -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)
                {