From c13b1b775b2ff3918d53d0babed8247d8d34593c Mon Sep 17 00:00:00 2001
From: Nick Clifton <nickc@redhat.com>
Date: Fri, 25 Aug 2000 20:44:09 +0000
Subject: [PATCH] When choosing the target for a particular endianness, do
 nothing if the target is not supported.

---
 ld/ChangeLog |  6 ++++++
 ld/ldlang.c  | 55 ++++++++++++++++++++++++++++------------------------
 2 files changed, 36 insertions(+), 25 deletions(-)

diff --git a/ld/ChangeLog b/ld/ChangeLog
index 89e1c348505..e9d239b1dbc 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,9 @@
+2000-08-25  Nick Clifton  <nickc@redhat.com>
+
+	* ldlang.c (open_output): When choosing the target for a
+	particular endianness, do nothing if the target is not
+	supported.
+
 2000-08-25  H.J. Lu  <hjl@gnu.org>
 
 	* emultempl/elf32.em (gld${EMULATION_NAME}_after_open): Don't
diff --git a/ld/ldlang.c b/ld/ldlang.c
index c3420c5434c..baaf7ed55d9 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -1728,32 +1728,37 @@ open_output (name)
       /* Get the chosen target.  */
       target = bfd_search_for_target (get_target, (void *) output_target);
 
-      if (command_line.endian == ENDIAN_BIG)
-	desired_endian = BFD_ENDIAN_BIG;
-      else
-	desired_endian = BFD_ENDIAN_LITTLE;
-      
-      /* See if the target has the wrong endianness.  This should not happen
-	 if the linker script has provided big and little endian alternatives,
-	 but some scrips don't do this.  */
-      if (target->byteorder != desired_endian)
+      /* If the target is not supported, we cannot do anything.  */
+      if (target != NULL)
 	{
-	  /* If it does, then see if the target provides
-	     an alternative with the correct endianness.  */
-	  if (target->alternative_target != NULL
-	      && (target->alternative_target->byteorder == desired_endian))
-	    output_target = target->alternative_target->name;
+	  if (command_line.endian == ENDIAN_BIG)
+	    desired_endian = BFD_ENDIAN_BIG;
 	  else
+	    desired_endian = BFD_ENDIAN_LITTLE;
+	  
+	  /* See if the target has the wrong endianness.  This should not happen
+	     if the linker script has provided big and little endian alternatives,
+	     but some scrips don't do this.  */
+	  if (target->byteorder != desired_endian)
 	    {
-	      /* Try to find a target as similar as possible to the default
-		 target, but which has the desired endian characteristic.  */
-	      (void) bfd_search_for_target (closest_target_match, (void *) target);
-	      
-	      /* Oh dear - we could not find any targets that satisfy our requirements.  */
-	      if (winner == NULL)
-		einfo (_("%P: warning: could not find any targets that match endianness requirement\n"));
+	      /* If it does, then see if the target provides
+		 an alternative with the correct endianness.  */
+	      if (target->alternative_target != NULL
+		  && (target->alternative_target->byteorder == desired_endian))
+		output_target = target->alternative_target->name;
 	      else
-		output_target = winner->name;
+		{
+		  /* Try to find a target as similar as possible to the default
+		     target, but which has the desired endian characteristic.  */
+		  (void) bfd_search_for_target (closest_target_match, (void *) target);
+		  
+		  /* Oh dear - we could not find any targets that satisfy our
+		     requirements.  */
+		  if (winner == NULL)
+		    einfo (_("%P: warning: could not find any targets that match endianness requirement\n"));
+		  else
+		    output_target = winner->name;
+		}
 	    }
 	}
     }
@@ -3155,14 +3160,15 @@ lang_do_assignments (s, output_section_statement, fill, dot)
 		dot = os->bfd_section->vma + os->bfd_section->_raw_size / opb;
 
 	      }
-	    if (os->load_base) 
+	    if (os->load_base)
 	      {
 		/* If nothing has been placed into the output section then
 		   it won't have a bfd_section. */
 		if (os->bfd_section) 
 		  {
 		    os->bfd_section->lma 
-		      = exp_get_abs_int(os->load_base, 0,"load base", lang_final_phase_enum);
+		      = exp_get_abs_int(os->load_base, 0,"load base",
+					lang_final_phase_enum);
 		  }
 	      }
 	  }
@@ -3873,7 +3879,6 @@ lang_enter_output_section_statement (output_section_statement_name,
   return os;
 }
 
-
 void
 lang_final ()
 {