* archures.c (bfd_arch_get_compatible): If one arch is unknown,
authorAlan Modra <amodra@gmail.com>
Sat, 4 Jun 2011 04:07:54 +0000 (04:07 +0000)
committerAlan Modra <amodra@gmail.com>
Sat, 4 Jun 2011 04:07:54 +0000 (04:07 +0000)
return the other arch.
* elfcode.h (elf_object_p): Allow explicit match to generic ELF
target.

bfd/ChangeLog
bfd/archures.c
bfd/elfcode.h

index 034e9e7..30b34b6 100644 (file)
@@ -1,3 +1,10 @@
+2011-06-04  Alan Modra  <amodra@gmail.com>
+
+       * archures.c (bfd_arch_get_compatible): If one arch is unknown,
+       return the other arch.
+       * elfcode.h (elf_object_p): Allow explicit match to generic ELF
+       target.
+
 2011-06-03  Bertram Felgenhauer  <bertram.felgenhauer@gmail.com>
 
        PR ld/12682
index cd8500f..df22b81 100644 (file)
@@ -1,6 +1,6 @@
 /* BFD library support routines for architectures.
    Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
    Free Software Foundation, Inc.
    Hacked by John Gilmore and Steve Chamberlain of Cygnus Support.
 
@@ -748,25 +748,26 @@ bfd_arch_get_compatible (const bfd *abfd,
                         const bfd *bbfd,
                         bfd_boolean accept_unknowns)
 {
-  const bfd * ubfd = NULL;
+  const bfd *ubfd, *kbfd;
 
   /* Look for an unknown architecture.  */
-  if (((ubfd = abfd) && ubfd->arch_info->arch == bfd_arch_unknown)
-      || ((ubfd = bbfd) && ubfd->arch_info->arch == bfd_arch_unknown))
-    {
-      /* We can allow an unknown architecture if accept_unknowns
-        is true, or if the target is the "binary" format, which
-        has an unknown architecture.  Since the binary format can
-        only be set by explicit request from the user, it is safe
-        to assume that they know what they are doing.  */
-      if (accept_unknowns
-         || strcmp (bfd_get_target (ubfd), "binary") == 0)
-       return ubfd->arch_info;
-      return NULL;
-    }
-
-  /* Otherwise architecture-specific code has to decide.  */
-  return abfd->arch_info->compatible (abfd->arch_info, bbfd->arch_info);
+  if (abfd->arch_info->arch == bfd_arch_unknown)
+    ubfd = abfd, kbfd = bbfd;
+  else if (bbfd->arch_info->arch == bfd_arch_unknown)
+    ubfd = bbfd, kbfd = abfd;
+  else
+    /* Otherwise architecture-specific code has to decide.  */
+    return abfd->arch_info->compatible (abfd->arch_info, bbfd->arch_info);
+
+  /* We can allow an unknown architecture if accept_unknowns
+     is true, or if the target is the "binary" format, which
+     has an unknown architecture.  Since the binary format can
+     only be set by explicit request from the user, it is safe
+     to assume that they know what they are doing.  */
+  if (accept_unknowns
+      || strcmp (bfd_get_target (ubfd), "binary") == 0)
+    return kbfd->arch_info;
+  return NULL;
 }
 
 /*
index d8833df..fdfeee9 100644 (file)
@@ -595,26 +595,27 @@ elf_object_p (bfd *abfd)
 
       /* This is the generic ELF target.  Let it match any ELF target
         for which we do not have a specific backend.  */
-      for (target_ptr = bfd_target_vector; *target_ptr != NULL; target_ptr++)
-       {
-         const struct elf_backend_data *back;
-
-         if ((*target_ptr)->flavour != bfd_target_elf_flavour)
-           continue;
-         back = xvec_get_elf_backend_data (*target_ptr);
-         if (back->s->arch_size != ARCH_SIZE)
-           continue;
-         if (back->elf_machine_code == i_ehdrp->e_machine
-             || (back->elf_machine_alt1 != 0
-                 && back->elf_machine_alt1 == i_ehdrp->e_machine)
-             || (back->elf_machine_alt2 != 0
-                 && back->elf_machine_alt2 == i_ehdrp->e_machine))
-           {
-             /* target_ptr is an ELF backend which matches this
-                object file, so reject the generic ELF target.  */
-             goto got_wrong_format_error;
-           }
-       }
+      if (abfd->target_defaulted)
+       for (target_ptr = bfd_target_vector; *target_ptr != NULL; target_ptr++)
+         {
+           const struct elf_backend_data *back;
+
+           if ((*target_ptr)->flavour != bfd_target_elf_flavour)
+             continue;
+           back = xvec_get_elf_backend_data (*target_ptr);
+           if (back->s->arch_size != ARCH_SIZE)
+             continue;
+           if (back->elf_machine_code == i_ehdrp->e_machine
+               || (back->elf_machine_alt1 != 0
+                   && back->elf_machine_alt1 == i_ehdrp->e_machine)
+               || (back->elf_machine_alt2 != 0
+                   && back->elf_machine_alt2 == i_ehdrp->e_machine))
+             {
+               /* target_ptr is an ELF backend which matches this
+                  object file, so reject the generic ELF target.  */
+               goto got_wrong_format_error;
+             }
+         }
     }
 
   if (i_ehdrp->e_type == ET_EXEC)