Add support for WinCE based toolchains.
[deliverable/binutils-gdb.git] / ld / ldfile.c
index 1dfa31f219266e40035c9d6bed4805f8b51d4c90..187770e892b73f8aad80d86db6fe5ccbd81634f5 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 92, 93, 94, 95, 98, 1999 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 92, 93, 94, 95, 98, 99, 2000 Free Software Foundation, Inc.
 
 This file is part of GLD, the Gnu Linker.
 
 
 This file is part of GLD, the Gnu Linker.
 
@@ -74,9 +74,6 @@ typedef struct search_arch
 static search_arch_type *search_arch_head;
 static search_arch_type **search_arch_tail_ptr = &search_arch_head;
  
 static search_arch_type *search_arch_head;
 static search_arch_type **search_arch_tail_ptr = &search_arch_head;
  
-static boolean ldfile_open_file_search
-  PARAMS ((const char *arch, lang_input_statement_type *,
-          const char *lib, const char *suffix));
 static FILE *try_open PARAMS ((const char *name, const char *exten));
 
 void
 static FILE *try_open PARAMS ((const char *name, const char *exten));
 
 void
@@ -111,20 +108,46 @@ ldfile_try_open_bfd (attempt, entry)
        info_msg (_("attempt to open %s succeeded\n"), attempt);
     }
 
        info_msg (_("attempt to open %s succeeded\n"), attempt);
     }
 
-  if (entry->the_bfd != NULL)
-    return true;
-  else
+  if (entry->the_bfd == NULL)
     {
       if (bfd_get_error () == bfd_error_invalid_target)
        einfo (_("%F%P: invalid BFD target `%s'\n"), entry->target);
       return false;
     }
     {
       if (bfd_get_error () == bfd_error_invalid_target)
        einfo (_("%F%P: invalid BFD target `%s'\n"), entry->target);
       return false;
     }
+
+  /* If we are searching for this file, see if the architecture is
+     compatible with the output file.  If it isn't, keep searching.
+     If we can't open the file as an object file, stop the search
+     here.  */
+
+  if (entry->search_dirs_flag)
+    {
+      bfd *check;
+
+      if (bfd_check_format (entry->the_bfd, bfd_archive))
+       check = bfd_openr_next_archived_file (entry->the_bfd, NULL);
+      else
+       check = entry->the_bfd;
+
+      if (! bfd_check_format (check, bfd_object))
+       return true;
+      if (bfd_arch_get_compatible (check, output_bfd) == NULL)
+       {
+         einfo (_("%P: skipping incompatible %s when searching for %s"),
+                attempt, entry->local_sym_name);
+         bfd_close (entry->the_bfd);
+         entry->the_bfd = NULL;
+         return false;
+       }
+    }
+
+  return true;
 }
 
 /* Search for and open the file specified by ENTRY.  If it is an
    archive, use ARCH, LIB and SUFFIX to modify the file name.  */
 
 }
 
 /* Search for and open the file specified by ENTRY.  If it is an
    archive, use ARCH, LIB and SUFFIX to modify the file name.  */
 
-static boolean
+boolean
 ldfile_open_file_search (arch, entry, lib, suffix)
      const char *arch;
      lang_input_statement_type *entry;
 ldfile_open_file_search (arch, entry, lib, suffix)
      const char *arch;
      lang_input_statement_type *entry;
@@ -221,6 +244,8 @@ ldfile_open_file (entry)
          if (ldfile_open_file_search (arch->name, entry, ":lib", ".a"))
            return;
 #endif
          if (ldfile_open_file_search (arch->name, entry, ":lib", ".a"))
            return;
 #endif
+         if (ldemul_find_potential_libraries (arch->name, entry))
+           return;
        }
       einfo (_("%F%P: cannot find %s\n"), entry->local_sym_name);
     }
        }
       einfo (_("%F%P: cannot find %s\n"), entry->local_sym_name);
     }
This page took 0.027033 seconds and 4 git commands to generate.