Nick Clifton 58ff63
diff -rup binutils-2.25.1.orig/bfd/plugin.c binutils-2.25.1/bfd/plugin.c
Nick Clifton 58ff63
--- binutils-2.25.1.orig/bfd/plugin.c	2015-11-05 11:40:58.400941923 +0000
Nick Clifton 58ff63
+++ binutils-2.25.1/bfd/plugin.c	2015-11-05 15:50:37.046908541 +0000
Nick Clifton 58ff63
@@ -135,8 +135,9 @@ static asection bfd_plugin_fake_common_s
Nick Clifton 58ff63
   = BFD_FAKE_SECTION (bfd_plugin_fake_common_section, SEC_IS_COMMON, 0,
Nick Clifton 58ff63
 		      NULL, 0);
Nick Clifton 58ff63
 
Nick Clifton 58ff63
-/* Get symbols from object only section.  */
Nick Clifton 58ff63
+static bfd_boolean in_get_symbols = FALSE;
Nick Clifton 58ff63
 
Nick Clifton 58ff63
+/* Get symbols from object only section.  */
Nick Clifton 58ff63
 static void
Nick Clifton 58ff63
 bfd_plugin_get_symbols_in_object_only (bfd *abfd)
Nick Clifton 58ff63
 {
Nick Clifton 58ff63
@@ -153,7 +154,8 @@ bfd_plugin_get_symbols_in_object_only (b
Nick Clifton 58ff63
   if (abfd->sections == NULL && abfd->my_archive == NULL)
Nick Clifton 58ff63
     {
Nick Clifton 58ff63
       nbfd = bfd_openr (abfd->filename, NULL);
Nick Clifton 58ff63
-      if (nbfd == NULL || !bfd_check_format (nbfd, bfd_object))
Nick Clifton 58ff63
+      
Nick Clifton 58ff63
+      if (nbfd == NULL)
Nick Clifton 58ff63
 	{
Nick Clifton 58ff63
 	  (*_bfd_error_handler)
Nick Clifton 58ff63
 	    (_("%s: failed to open to extract object only section: %s"),
Nick Clifton 58ff63
@@ -161,6 +163,22 @@ bfd_plugin_get_symbols_in_object_only (b
Nick Clifton 58ff63
 	  bfd_close (nbfd);
Nick Clifton 58ff63
 	  return;
Nick Clifton 58ff63
 	}
Nick Clifton 58ff63
+      else
Nick Clifton 58ff63
+	{
Nick Clifton 58ff63
+	  /* Note that we are calling bfd_check_format from inside
Nick Clifton 58ff63
+	     bfd_plugin_get_symbols_in_object_only.  bfd_check_format
Nick Clifton 58ff63
+	     will iterate through the known list of formats, including
Nick Clifton 58ff63
+	     the "plugin" format, and we do not want to end up in a
Nick Clifton 58ff63
+	     recursive loop.  */
Nick Clifton 58ff63
+	  in_get_symbols = TRUE;
Nick Clifton 58ff63
+	  if (!bfd_check_format (nbfd, bfd_object))
Nick Clifton 58ff63
+	    {
Nick Clifton 58ff63
+	      in_get_symbols = FALSE;
Nick Clifton 58ff63
+	      bfd_close (nbfd);
Nick Clifton 58ff63
+	      return;
Nick Clifton 58ff63
+	    }
Nick Clifton 58ff63
+	  in_get_symbols = FALSE;
Nick Clifton 58ff63
+	}
Nick Clifton 58ff63
     }
Nick Clifton 58ff63
   else
Nick Clifton 58ff63
     {
Nick Clifton e37b50
@@ -515,6 +515,12 @@ load_plugin (bfd *abfd)
Nick Clifton 58ff63
 static const bfd_target *
Nick Clifton 58ff63
 bfd_plugin_object_p (bfd *abfd)
Nick Clifton 58ff63
 {
Nick Clifton 58ff63
+  /* If in_get_symbols is TRUE then this function is being called from
Nick Clifton 58ff63
+     bfd_check_format.  We do not want to iterate again - we will just
Nick Clifton 58ff63
+     end up in an infinite loop.  So return NULL here.  */
Nick Clifton 58ff63
+  if (in_get_symbols)
Nick Clifton 58ff63
+    return NULL;
Nick Clifton 58ff63
+
Nick Clifton e37b50
   if (ld_plugin_object_p)
Nick Clifton e37b50
     return ld_plugin_object_p (abfd);
Nick Clifton 58ff63