OSDN Git Service

* elf64-ppc.c (toc_adjusting_stub_needed): Any call via the plt
authorAlan Modra <amodra@bigpond.net.au>
Mon, 11 Aug 2008 14:38:40 +0000 (14:38 +0000)
committerAlan Modra <amodra@bigpond.net.au>
Mon, 11 Aug 2008 14:38:40 +0000 (14:38 +0000)
needs r2 valid, not just those to external syms.

bfd/ChangeLog
bfd/elf64-ppc.c

index 0fd031c..4d8b0c6 100644 (file)
@@ -1,3 +1,8 @@
+2008-08-11  Alan Modra  <amodra@bigpond.net.au>
+
+       * elf64-ppc.c (toc_adjusting_stub_needed): Any call via the plt
+       needs r2 valid, not just those to external syms.
+
 2008-08-09  Pedro Alves  <pedro@codesourcery.com>
 
        * archive.c (_bfd_archive_bsd_update_armap_timestamp): Cast stat
index 727b6ac..3ee3f69 100644 (file)
@@ -9184,6 +9184,7 @@ toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec)
       enum elf_ppc64_reloc_type r_type;
       unsigned long r_symndx;
       struct elf_link_hash_entry *h;
+      struct ppc_link_hash_entry *eh;
       Elf_Internal_Sym *sym;
       asection *sym_sec;
       struct _opd_sec_data *opd;
@@ -9206,24 +9207,21 @@ toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec)
        }
 
       /* Calls to dynamic lib functions go through a plt call stub
-        that uses r2.  Branches to undefined symbols might be a call
-        using old-style dot symbols that can be satisfied by a plt
-        call into a new-style dynamic library.  */
-      if (sym_sec == NULL)
+        that uses r2.  */
+      eh = (struct ppc_link_hash_entry *) h;
+      if (eh != NULL
+         && (eh->elf.plt.plist != NULL
+             || (eh->oh != NULL
+                 && eh->oh->elf.plt.plist != NULL)))
        {
-         struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
-         if (eh != NULL
-             && eh->oh != NULL
-             && eh->oh->elf.plt.plist != NULL)
-           {
-             ret = 1;
-             break;
-           }
-
-         /* Ignore other undefined symbols.  */
-         continue;
+         ret = 1;
+         break;
        }
 
+      if (sym_sec == NULL)
+       /* Ignore other undefined symbols.  */
+       continue;
+
       /* Assume branches to other sections not included in the link need
         stubs too, to cover -R and absolute syms.  */
       if (sym_sec->output_section == NULL)