linux-x86.exp: Compile with -I../bfd
[deliverable/binutils-gdb.git] / ld / ldfile.c
index 5bb08f7b2e46f1072efc92de6b5a1c7bb109f6c1..d98429d7b8846f6465a33ec30db722b1c5cf6387 100644 (file)
@@ -1,5 +1,5 @@
 /* Linker file opening and searching.
-   Copyright (C) 1991-2019 Free Software Foundation, Inc.
+   Copyright (C) 1991-2020 Free Software Foundation, Inc.
 
    This file is part of the GNU Binutils.
 
@@ -21,6 +21,7 @@
 #include "sysdep.h"
 #include "bfd.h"
 #include "bfdlink.h"
+#include "ctf-api.h"
 #include "safe-ctype.h"
 #include "ld.h"
 #include "ldmisc.h"
@@ -186,7 +187,7 @@ ldfile_try_open_bfd (const char *attempt,
                  extern FILE *yyin;
 
                  /* Try to interpret the file as a linker script.  */
-                 ldfile_open_script_file (attempt);
+                 ldfile_open_command_file (attempt);
 
                  ldfile_assumed_script = TRUE;
                  parser_input = input_selected;
@@ -301,7 +302,7 @@ ldfile_try_open_bfd (const char *attempt,
            }
        }
     }
-success:
+ success:
 #ifdef ENABLE_PLUGINS
   /* If plugins are active, they get first chance to claim
      any successfully-opened input file.  We skip archives
@@ -444,6 +445,22 @@ ldfile_open_file (lang_input_statement_type *entry)
                   entry->local_sym_name, ld_sysroot);
          else
            einfo (_("%P: cannot find %s\n"), entry->local_sym_name);
+
+         /* PR 25747: Be kind to users who forgot to add the
+            "lib" prefix to their library when it was created.  */
+         for (arch = search_arch_head; arch != NULL; arch = arch->next)
+           {
+             if (ldfile_open_file_search (arch->name, entry, "", ".a"))
+               {
+                 const char * base = lbasename (entry->filename);
+
+                 einfo (_("%P: note to link with %s use -l:%s or rename it to lib%s\n"),
+                        entry->filename, base, base);
+                 bfd_close (entry->the_bfd);
+                 entry->the_bfd = NULL;
+                 break;
+               }
+           }
          entry->flags.missing_file = TRUE;
          input_flags.missing_file = TRUE;
        }
@@ -585,44 +602,56 @@ ldfile_find_command_file (const char *name,
   return result;
 }
 
+enum script_open_style {
+  script_nonT,
+  script_T,
+  script_defaultT
+};
+
+struct script_name_list
+{
+  struct script_name_list *next;
+  enum script_open_style open_how;
+  char name[1];
+};
+
 /* Open command file NAME.  */
 
 static void
-ldfile_open_command_file_1 (const char *name,
-                           bfd_boolean default_only,
-                           bfd_boolean is_script)
+ldfile_open_command_file_1 (const char *name, enum script_open_style open_how)
 {
   FILE *ldlex_input_stack;
   bfd_boolean sysrooted;
+  static struct script_name_list *processed_scripts = NULL;
+  struct script_name_list *script;
+  size_t len;
 
-  if (is_script)
+  /* PR 24576: Catch the case where the user has accidentally included
+     the same linker script twice.  */
+  for (script = processed_scripts; script != NULL; script = script->next)
     {
-      static struct name_list *processed_scripts = NULL;
-      struct name_list *script;
-
-      /* PR 24576: Catch the case where the user has accidentally included
-        the same linker script twice.  */
-      for (script = processed_scripts; script != NULL; script = script->next)
+      if ((open_how != script_nonT || script->open_how != script_nonT)
+         && strcmp (name, script->name) == 0)
        {
-         if (strcmp (name, script->name) == 0)
-           {
-             einfo (_("%F%P: error: linker script file '%s' appears multiple times\n"),
-                    name);
-             return;
-           }
+         einfo (_("%F%P: error: linker script file '%s'"
+                  " appears multiple times\n"), name);
+         return;
        }
-
-      /* FIXME: This memory is never freed, but that should not really matter.
-        It will be released when the linker exits, and it is unlikely to ever
-        be more than a few tens of bytes.  */
-      script = xmalloc (sizeof (name_list));
-      script->name = strdup (name);
-      script->next = processed_scripts;
-      processed_scripts = script;
     }
 
-  ldlex_input_stack = ldfile_find_command_file (name, default_only, &sysrooted);
-
+  /* FIXME: This memory is never freed, but that should not really matter.
+     It will be released when the linker exits, and it is unlikely to ever
+     be more than a few tens of bytes.  */
+  len = strlen (name);
+  script = xmalloc (sizeof (*script) + len);
+  script->next = processed_scripts;
+  script->open_how = open_how;
+  memcpy (script->name, name, len + 1);
+  processed_scripts = script;
+
+  ldlex_input_stack = ldfile_find_command_file (name,
+                                               open_how == script_defaultT,
+                                               &sysrooted);
   if (ldlex_input_stack == NULL)
     {
       bfd_set_error (bfd_error_system_call);
@@ -643,13 +672,13 @@ ldfile_open_command_file_1 (const char *name,
 void
 ldfile_open_command_file (const char *name)
 {
-  ldfile_open_command_file_1 (name, FALSE, FALSE);
+  ldfile_open_command_file_1 (name, script_nonT);
 }
 
 void
 ldfile_open_script_file (const char *name)
 {
-  ldfile_open_command_file_1 (name, FALSE, TRUE);
+  ldfile_open_command_file_1 (name, script_T);
 }
 
 /* Open command file NAME at the default script location.  */
@@ -657,7 +686,7 @@ ldfile_open_script_file (const char *name)
 void
 ldfile_open_default_command_file (const char *name)
 {
-  ldfile_open_command_file_1 (name, TRUE, TRUE);
+  ldfile_open_command_file_1 (name, script_defaultT);
 }
 
 void
This page took 0.031543 seconds and 4 git commands to generate.