Jakub Jelinek 783379
2007-03-13  H.J. Lu  <hongjiu.lu@intel.com>
Jakub Jelinek 783379
Jakub Jelinek 783379
	PR binutils/3826
Jakub Jelinek 783379
	* elf-bfd.h (_bfd_elf_check_osabi): Removed.
Jakub Jelinek 783379
Jakub Jelinek 783379
	* elf.c (_bfd_elf_check_osabi): Removed.
Jakub Jelinek 783379
Jakub Jelinek 783379
	* elfcode.h (elf_object_p): Match the ELFOSABI_NONE ELF target
Jakub Jelinek 783379
	with any ELF target of the same machine for which we do not
Jakub Jelinek 783379
	have a specific backend.
Jakub Jelinek 783379
Jakub Jelinek 783379
	* elfxx-target.h (elf_backend_object_p): Default to 0.
Jakub Jelinek 783379
Jakub Jelinek 783379
--- bfd/elf-bfd.h.jj	2007-01-28 11:49:30.000000000 -0500
Jakub Jelinek 783379
+++ bfd/elf-bfd.h	2007-03-14 05:28:16.000000000 -0400
Jakub Jelinek 783379
@@ -1736,8 +1736,6 @@ extern bfd_boolean _bfd_elf_setup_sectio
Jakub Jelinek 783379
 
Jakub Jelinek 783379
 extern void _bfd_elf_set_osabi (bfd * , struct bfd_link_info *);
Jakub Jelinek 783379
 
Jakub Jelinek 783379
-extern bfd_boolean _bfd_elf_check_osabi (bfd *);
Jakub Jelinek 783379
-
Jakub Jelinek 783379
 extern const bfd_target *bfd_elf32_object_p
Jakub Jelinek 783379
   (bfd *);
Jakub Jelinek 783379
 extern const bfd_target *bfd_elf32_core_file_p
Jakub Jelinek 783379
--- bfd/elf.c.jj	2007-01-28 11:49:30.000000000 -0500
Jakub Jelinek 783379
+++ bfd/elf.c	2007-03-14 05:28:31.000000000 -0400
Jakub Jelinek 783379
@@ -9135,14 +9135,3 @@ _bfd_elf_set_osabi (bfd * abfd,
Jakub Jelinek 783379
 
Jakub Jelinek 783379
   i_ehdrp->e_ident[EI_OSABI] = get_elf_backend_data (abfd)->elf_osabi;
Jakub Jelinek 783379
 }
Jakub Jelinek 783379
-
Jakub Jelinek 783379
-bfd_boolean
Jakub Jelinek 783379
-_bfd_elf_check_osabi (bfd *abfd)
Jakub Jelinek 783379
-{
Jakub Jelinek 783379
-  Elf_Internal_Ehdr * i_ehdrp;	/* ELF file header, internal form.  */
Jakub Jelinek 783379
-
Jakub Jelinek 783379
-  i_ehdrp = elf_elfheader (abfd);
Jakub Jelinek 783379
-
Jakub Jelinek 783379
-  return (i_ehdrp->e_ident[EI_OSABI]
Jakub Jelinek 783379
-	  == get_elf_backend_data (abfd)->elf_osabi);
Jakub Jelinek 783379
-}
Jakub Jelinek 783379
--- bfd/elfxx-target.h.jj	2007-01-28 11:49:30.000000000 -0500
Jakub Jelinek 783379
+++ bfd/elfxx-target.h	2007-03-14 05:29:27.000000000 -0400
Jakub Jelinek 783379
@@ -320,7 +320,7 @@
Jakub Jelinek 783379
 #define elf_backend_sym_is_global	0
Jakub Jelinek 783379
 #endif
Jakub Jelinek 783379
 #ifndef elf_backend_object_p
Jakub Jelinek 783379
-#define elf_backend_object_p		_bfd_elf_check_osabi
Jakub Jelinek 783379
+#define elf_backend_object_p		0
Jakub Jelinek 783379
 #endif
Jakub Jelinek 783379
 #ifndef elf_backend_symbol_processing
Jakub Jelinek 783379
 #define elf_backend_symbol_processing	0
Jakub Jelinek 783379
--- bfd/elfcode.h.jj	2006-09-24 11:19:58.000000000 -0400
Jakub Jelinek 783379
+++ bfd/elfcode.h	2007-03-14 05:30:17.000000000 -0400
Jakub Jelinek 783379
@@ -500,6 +500,8 @@ elf_object_p (bfd *abfd)
Jakub Jelinek 783379
   struct bfd_preserve preserve;
Jakub Jelinek 783379
   asection *s;
Jakub Jelinek 783379
   bfd_size_type amt;
Jakub Jelinek 783379
+  const bfd_target *target;
Jakub Jelinek 783379
+  const bfd_target * const *target_ptr;
Jakub Jelinek 783379
 
Jakub Jelinek 783379
   preserve.marker = NULL;
Jakub Jelinek 783379
 
Jakub Jelinek 783379
@@ -543,10 +545,12 @@ elf_object_p (bfd *abfd)
Jakub Jelinek 783379
   if (!bfd_preserve_save (abfd, &preserve))
Jakub Jelinek 783379
     goto got_no_match;
Jakub Jelinek 783379
 
Jakub Jelinek 783379
+  target = abfd->xvec;
Jakub Jelinek 783379
+
Jakub Jelinek 783379
   /* Allocate an instance of the elf_obj_tdata structure and hook it up to
Jakub Jelinek 783379
      the tdata pointer in the bfd.  */
Jakub Jelinek 783379
 
Jakub Jelinek 783379
-  if (! (*abfd->xvec->_bfd_set_format[bfd_object]) (abfd))
Jakub Jelinek 783379
+  if (! (*target->_bfd_set_format[bfd_object]) (abfd))
Jakub Jelinek 783379
     goto got_no_match;
Jakub Jelinek 783379
   preserve.marker = elf_tdata (abfd);
Jakub Jelinek 783379
 
Jakub Jelinek 783379
@@ -586,8 +590,6 @@ elf_object_p (bfd *abfd)
Jakub Jelinek 783379
       && (ebd->elf_machine_alt2 == 0
Jakub Jelinek 783379
 	  || i_ehdrp->e_machine != ebd->elf_machine_alt2))
Jakub Jelinek 783379
     {
Jakub Jelinek 783379
-      const bfd_target * const *target_ptr;
Jakub Jelinek 783379
-
Jakub Jelinek 783379
       if (ebd->elf_machine_code != EM_NONE)
Jakub Jelinek 783379
 	goto got_wrong_format_error;
Jakub Jelinek 783379
 
Jakub Jelinek 783379
@@ -628,6 +630,45 @@ elf_object_p (bfd *abfd)
Jakub Jelinek 783379
 	goto got_no_match;
Jakub Jelinek 783379
     }
Jakub Jelinek 783379
 
Jakub Jelinek 783379
+  if (ebd->elf_machine_code != EM_NONE
Jakub Jelinek 783379
+      && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi)
Jakub Jelinek 783379
+    {
Jakub Jelinek 783379
+      if (ebd->elf_osabi != ELFOSABI_NONE)
Jakub Jelinek 783379
+	goto got_wrong_format_error;
Jakub Jelinek 783379
+
Jakub Jelinek 783379
+      /* This is an ELFOSABI_NONE ELF target.  Let it match any ELF
Jakub Jelinek 783379
+	 target of the compatible machine for which we do not have a
Jakub Jelinek 783379
+	 backend with matching ELFOSABI.  */
Jakub Jelinek 783379
+      for (target_ptr = bfd_target_vector;
Jakub Jelinek 783379
+	   *target_ptr != NULL;
Jakub Jelinek 783379
+	   target_ptr++)
Jakub Jelinek 783379
+	{
Jakub Jelinek 783379
+	  const struct elf_backend_data *back;
Jakub Jelinek 783379
+
Jakub Jelinek 783379
+	  /* Skip this target and targets with incompatible byte
Jakub Jelinek 783379
+	     order.  */
Jakub Jelinek 783379
+	  if (*target_ptr == target
Jakub Jelinek 783379
+	      || (*target_ptr)->flavour != bfd_target_elf_flavour
Jakub Jelinek 783379
+	      || (*target_ptr)->byteorder != target->byteorder
Jakub Jelinek 783379
+	      || ((*target_ptr)->header_byteorder
Jakub Jelinek 783379
+		  != target->header_byteorder))
Jakub Jelinek 783379
+	    continue;
Jakub Jelinek 783379
+
Jakub Jelinek 783379
+	  back = (const struct elf_backend_data *) (*target_ptr)->backend_data;
Jakub Jelinek 783379
+	  if (back->elf_osabi == i_ehdrp->e_ident[EI_OSABI]
Jakub Jelinek 783379
+	      && (back->elf_machine_code == i_ehdrp->e_machine
Jakub Jelinek 783379
+		  || (back->elf_machine_alt1 != 0
Jakub Jelinek 783379
+		      && back->elf_machine_alt1 == i_ehdrp->e_machine)
Jakub Jelinek 783379
+		  || (back->elf_machine_alt2 != 0
Jakub Jelinek 783379
+		      && back->elf_machine_alt2 == i_ehdrp->e_machine)))
Jakub Jelinek 783379
+	    {
Jakub Jelinek 783379
+	      /* target_ptr is an ELF backend which matches this
Jakub Jelinek 783379
+		 object file, so reject the ELFOSABI_NONE ELF target.  */
Jakub Jelinek 783379
+	      goto got_wrong_format_error;
Jakub Jelinek 783379
+	    }
Jakub Jelinek 783379
+	}
Jakub Jelinek 783379
+    }
Jakub Jelinek 783379
+
Jakub Jelinek 783379
   if (i_ehdrp->e_shoff != 0)
Jakub Jelinek 783379
     {
Jakub Jelinek 783379
       bfd_signed_vma where = i_ehdrp->e_shoff;
Jakub Jelinek 783379
@@ -848,7 +889,7 @@ elf_object_p (bfd *abfd)
Jakub Jelinek 783379
     }
Jakub Jelinek 783379
 
Jakub Jelinek 783379
   bfd_preserve_finish (abfd, &preserve);
Jakub Jelinek 783379
-  return abfd->xvec;
Jakub Jelinek 783379
+  return target;
Jakub Jelinek 783379
 
Jakub Jelinek 783379
  got_wrong_format_error:
Jakub Jelinek 783379
   /* There is way too much undoing of half-known state here.  The caller,