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.
 
@@ -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 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
@@ -111,20 +108,46 @@ ldfile_try_open_bfd (attempt, entry)
        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 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.  */
 
-static boolean
+boolean
 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 (ldemul_find_potential_libraries (arch->name, entry))
+           return;
        }
       einfo (_("%F%P: cannot find %s\n"), entry->local_sym_name);
     }
This page took 0.036384 seconds and 4 git commands to generate.