* emulparams/elf32_tic6x_le.sh (OTHER_BSS_SECTIONS): New.
[binutils-gdb.git] / ld / ldfile.c
index 2aff7139643a7cafee73855f6081b01f9c2c1f5d..4661897b8226b4b3a3229d5ae4d2b604df7f7845 100644 (file)
@@ -1,6 +1,6 @@
 /* Linker file opening and searching.
    Copyright 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2000, 2001, 2002,
-   2003, 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+   2003, 2004, 2005, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
 
    This file is part of the GNU Binutils.
 
@@ -98,28 +98,28 @@ is_sysrooted_pathname (const char *name, bfd_boolean notsame)
 void
 ldfile_add_library_path (const char *name, bfd_boolean cmdline)
 {
-  search_dirs_type *new;
+  search_dirs_type *new_dirs;
 
   if (!cmdline && config.only_cmd_line_lib_dirs)
     return;
 
-  new = xmalloc (sizeof (search_dirs_type));
-  new->next = NULL;
-  new->cmdline = cmdline;
-  *search_tail_ptr = new;
-  search_tail_ptr = &new->next;
+  new_dirs = (search_dirs_type *) xmalloc (sizeof (search_dirs_type));
+  new_dirs->next = NULL;
+  new_dirs->cmdline = cmdline;
+  *search_tail_ptr = new_dirs;
+  search_tail_ptr = &new_dirs->next;
 
   /* If a directory is marked as honoring sysroot, prepend the sysroot path
      now.  */
   if (name[0] == '=')
     {
-      new->name = concat (ld_sysroot, name + 1, (const char *) NULL);
-      new->sysrooted = TRUE;
+      new_dirs->name = concat (ld_sysroot, name + 1, (const char *) NULL);
+      new_dirs->sysrooted = TRUE;
     }
   else
     {
-      new->name = xstrdup (name);
-      new->sysrooted = is_sysrooted_pathname (name, FALSE);
+      new_dirs->name = xstrdup (name);
+      new_dirs->sysrooted = is_sysrooted_pathname (name, FALSE);
     }
 }
 
@@ -363,7 +363,10 @@ ldfile_open_file_search (const char *arch,
   return FALSE;
 }
 
-/* Open the input file specified by ENTRY.  */
+/* Open the input file specified by ENTRY.
+   PR 4437: Do not stop on the first missing file, but
+   continue processing other input files in case there
+   are more errors to report.  */
 
 void
 ldfile_open_file (lang_input_statement_type *entry)
@@ -375,11 +378,15 @@ ldfile_open_file (lang_input_statement_type *entry)
     {
       if (ldfile_try_open_bfd (entry->filename, entry))
        return;
+
       if (strcmp (entry->filename, entry->local_sym_name) != 0)
-       einfo (_("%F%P: %s (%s): No such file: %E\n"),
+       einfo (_("%P: cannot find %s (%s): %E\n"),
               entry->filename, entry->local_sym_name);
       else
-       einfo (_("%F%P: %s: No such file: %E\n"), entry->local_sym_name);
+       einfo (_("%P: cannot find %s: %E\n"), entry->local_sym_name);
+
+      entry->missing_file = TRUE;
+      missing_file = TRUE;
     }
   else
     {
@@ -406,13 +413,18 @@ ldfile_open_file (lang_input_statement_type *entry)
         again.  */
       if (found)
        entry->search_dirs_flag = FALSE;
-      else if (entry->sysrooted
+      else
+       {
+         if (entry->sysrooted
               && ld_sysroot
               && IS_ABSOLUTE_PATH (entry->local_sym_name))
-       einfo (_("%F%P: cannot find %s inside %s\n"),
-              entry->local_sym_name, ld_sysroot);
-      else
-       einfo (_("%F%P: cannot find %s\n"), entry->local_sym_name);
+           einfo (_("%P: cannot find %s inside %s\n"),
+                  entry->local_sym_name, ld_sysroot);
+         else
+           einfo (_("%P: cannot find %s\n"), entry->local_sym_name);
+         entry->missing_file = TRUE;
+         missing_file = TRUE;
+       }
     }
 }
 
@@ -477,15 +489,12 @@ check_for_scripts_dir (char *dir)
    SCRIPTDIR (passed from Makefile)
             (adjusted according to the current location of the binary)
    SCRIPTDIR (passed from Makefile)
-   the dir where this program is (for using it from the build tree)
-   the dir where this program is/../lib
-            (for installing the tool suite elsewhere).  */
+   the dir where this program is (for using it from the build tree).  */
 
 static char *
 find_scripts_dir (void)
 {
-  char *end, *dir;
-  size_t dirlen;
+  char *dir;
 
   dir = make_relative_prefix (program_name, BINDIR, SCRIPTDIR);
   if (dir)
@@ -508,44 +517,21 @@ find_scripts_dir (void)
     return SCRIPTDIR;
 
   /* Look for "ldscripts" in the dir where our binary is.  */
-  end = strrchr (program_name, '/');
-#ifdef HAVE_DOS_BASED_FILE_SYSTEM
-  {
-    /* We could have \foo\bar, or /foo\bar.  */
-    char *bslash = strrchr (program_name, '\\');
-
-    if (end == NULL || (bslash != NULL && bslash > end))
-      end = bslash;
-  }
-#endif
+  dir = make_relative_prefix (program_name, ".", ".");
+  if (dir)
+    {
+      if (check_for_scripts_dir (dir))
+       return dir;
+      free (dir);
+    }
 
-  if (end == NULL)
-    /* Don't look for ldscripts in the current directory.  There is
-       too much potential for confusion.  */
-    return NULL;
-
-  dirlen = end - program_name;
-  /* Make a copy of program_name in dir.
-     Leave room for later "/../lib".  */
-  dir = xmalloc (dirlen + sizeof ("/../lib"));
-  strncpy (dir, program_name, dirlen);
-  dir[dirlen] = '\0';
-
-  if (check_for_scripts_dir (dir))
-    return dir;
-
-  /* Look for "ldscripts" in <the dir where our binary is>/../lib.  */
-  strcpy (dir + dirlen, "/../lib");
-  if (check_for_scripts_dir (dir))
-    return dir;
-  free (dir);
   return NULL;
 }
 
-/* Try to open NAME; if that fails, look for it in directories specified
-   with -L, then in the default script directory, without and with EXTEND
-   appended.  If DEFAULT_ONLY is true, the search is restricted to the
-   default script location.  */
+/* If DEFAULT_ONLY is false, try to open NAME; if that fails, look for
+   it in directories specified with -L, then in the default script
+   directory, without and with EXTEND appended.  If DEFAULT_ONLY is
+   true, the search is restricted to the default script location.  */
 
 static FILE *
 ldfile_find_command_file (const char *name, const char *extend,
@@ -556,10 +542,13 @@ ldfile_find_command_file (const char *name, const char *extend,
   char *buffer;
   static search_dirs_type *script_search;
 
-  /* First try raw name for uninstalled linker.  */
-  result = try_open (name, "");
-  if (result != NULL)
-    return result;
+  if (!default_only)
+    {
+      /* First try raw name.  */
+      result = try_open (name, "");
+      if (result != NULL)
+       return result;
+    }
 
   if (!script_search)
     {
@@ -638,19 +627,20 @@ void
 ldfile_add_arch (const char *in_name)
 {
   char *name = xstrdup (in_name);
-  search_arch_type *new = xmalloc (sizeof (search_arch_type));
+  search_arch_type *new_arch = (search_arch_type *)
+      xmalloc (sizeof (search_arch_type));
 
   ldfile_output_machine_name = in_name;
 
-  new->name = name;
-  new->next = NULL;
+  new_arch->name = name;
+  new_arch->next = NULL;
   while (*name)
     {
       *name = TOLOWER (*name);
       name++;
     }
-  *search_arch_tail_ptr = new;
-  search_arch_tail_ptr = &new->next;
+  *search_arch_tail_ptr = new_arch;
+  search_arch_tail_ptr = &new_arch->next;
 
 }