From 2917689a80eb96160c7d4d1788f050bdfdcae4f5 Mon Sep 17 00:00:00 2001
From: Alan Modra <amodra@gmail.com>
Date: Fri, 11 Feb 2005 14:18:15 +0000
Subject: [PATCH] 	* elf64-ppc.c (toc_adjusting_stub_needed): Return true
 for 	old-style branches to undefined dot-symbols which will be 
 satisfied by a plt call.

---
 bfd/ChangeLog   |  6 ++++++
 bfd/elf64-ppc.c | 25 +++++++++++++++++++------
 2 files changed, 25 insertions(+), 6 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index f73afa1170d..4b5600c9c54 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,9 @@
+2005-02-12  Alan Modra  <amodra@bigpond.net.au>
+
+	* elf64-ppc.c (toc_adjusting_stub_needed): Return true for
+	old-style branches to undefined dot-symbols which will be
+	satisfied by a plt call.
+
 2005-02-11  Alan Modra  <amodra@bigpond.net.au>
 
 	* elf64-ppc.c (move_plt_plist): New function, extracted from..
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index 4162d55fc85..86419b994c9 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -8361,13 +8361,27 @@ toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec)
 	  break;
 	}
 
-      /* Ignore branches to undefined syms.  */
+      /* 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)
-	continue;
+	{
+	  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;
+	    }
 
-      /* Calls to dynamic lib functions go through a plt call stub
-	 that uses r2.  Assume branches to other sections not included
-	 in the link need stubs too, to cover -R and absolute syms.  */
+	  /* 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)
 	{
 	  ret = 1;
@@ -8389,7 +8403,6 @@ toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec)
       opd_adjust = get_opd_info (sym_sec);
       if (opd_adjust != NULL)
 	{
-
 	  if (h == NULL)
 	    {
 	      long adjust;
-- 
GitLab