* ld.texinfo (-L): Mention that -L options do not affect how ld
authorKazu Hirata <kazu@codesourcery.com>
Mon, 6 Apr 2009 00:47:09 +0000 (00:47 +0000)
committerKazu Hirata <kazu@codesourcery.com>
Mon, 6 Apr 2009 00:47:09 +0000 (00:47 +0000)
searches for a linker script unless -T option is specified.
* ldfile.c (ldfile_find_command_file): Append the path obtained
from the program name to the search path instead of
prepending. Add a new parameter "default_only". Restrict the
search to the default script location if the new parameter is
true.
(ldfile_open_command_file_1): New.
(ldfile_open_command_file): Call ldfile_open_command_file_1.
(ldfile_open_default_command_file): New.

ld/ChangeLog
ld/ld.texinfo
ld/ldfile.c
ld/ldfile.h
ld/ldmain.c

index 78605abf4c6ca57d453ef12df154047fd1465fa8..e7df0814f7407078336d646f88c5e6e43196dd70 100644 (file)
@@ -1,3 +1,16 @@
+2009-04-06  Kazu Hirata  <kazu@codesourcery.com>
+
+       * ld.texinfo (-L): Mention that -L options do not affect how ld
+       searches for a linker script unless -T option is specified.
+       * ldfile.c (ldfile_find_command_file): Append the path obtained
+       from the program name to the search path instead of
+       prepending. Add a new parameter "default_only". Restrict the
+       search to the default script location if the new parameter is
+       true.
+       (ldfile_open_command_file_1): New.
+       (ldfile_open_command_file): Call ldfile_open_command_file_1.
+       (ldfile_open_default_command_file): New.
+
 2009-04-03  Nathan Sidwell  <nathan@codesourcery.com>
 
        * ldlang.c (lang_leave_output_section_statement): Set lma_region
index b6f0a0b00adcbd995c8c20442be17323152b125c..a7169d938f86ba2d69ad401ae3009e7f7abd07e4 100644 (file)
@@ -673,7 +673,9 @@ option any number of times.  The directories are searched in the order
 in which they are specified on the command line.  Directories specified
 on the command line are searched before the default directories.  All
 @option{-L} options apply to all @option{-l} options, regardless of the
-order in which the options appear.
+order in which the options appear.  @option{-L} options do not affect
+how @command{ld} searches for a linker script unless @option{-T}
+option is specified.
 
 If @var{searchdir} begins with @code{=}, then the @code{=} will be replaced
 by the @dfn{sysroot prefix}, a path specified when the linker is configured.
index a24eae6c038f46cba8443025c17bd7751aeee317..380b56ac68ef09979181d7c8ea823611ab618580 100644 (file)
@@ -542,22 +542,27 @@ find_scripts_dir (void)
   return NULL;
 }
 
-/* Try to open NAME; if that fails, look for it in the default script
-   directory, then in any directories specified with -L, without and
-   with EXTEND appended.  */
+/* 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)
+ldfile_find_command_file (const char *name, const char *extend,
+                         bfd_boolean default_only)
 {
   search_dirs_type *search;
   FILE *result;
   char *buffer;
   static search_dirs_type *script_search;
 
-  /* First try raw name.  */
-  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)
     {
@@ -569,16 +574,17 @@ ldfile_find_command_file (const char *name, const char *extend)
          ldfile_add_library_path (script_dir, TRUE);
          search_tail_ptr = save_tail_ptr;
        }
-      if (!script_search)
-       script_search = search_head;
-      else
-       script_search->next = search_head;
     }
 
+  /* Temporarily append script_search to the path list so that the
+     paths specified with -L will be searched first.  */
+  *search_tail_ptr = script_search;
+
   /* Try now prefixes.  */
-  for (search = script_search; search != NULL; search = search->next)
+  for (search = default_only ? script_search : search_head;
+       search != NULL;
+       search = search->next)
     {
-
       buffer = concat (search->name, slash, name, (const char *) NULL);
       result = try_open (buffer, extend);
       free (buffer);
@@ -586,14 +592,19 @@ ldfile_find_command_file (const char *name, const char *extend)
        break;
     }
 
+  /* Restore the original path list.  */
+  *search_tail_ptr = NULL;
+
   return result;
 }
 
-void
-ldfile_open_command_file (const char *name)
+/* Open command file NAME.  */
+
+static void
+ldfile_open_command_file_1 (const char *name, bfd_boolean default_only)
 {
   FILE *ldlex_input_stack;
-  ldlex_input_stack = ldfile_find_command_file (name, "");
+  ldlex_input_stack = ldfile_find_command_file (name, "", default_only);
 
   if (ldlex_input_stack == NULL)
     {
@@ -609,6 +620,23 @@ ldfile_open_command_file (const char *name)
   saved_script_handle = ldlex_input_stack;
 }
 
+/* Open command file NAME in the current directory, -L directories,
+   the default script location, in that order.  */
+
+void
+ldfile_open_command_file (const char *name)
+{
+  ldfile_open_command_file_1 (name, FALSE);
+}
+
+/* Open command file NAME at the default script location.  */
+
+void
+ldfile_open_default_command_file (const char *name)
+{
+  ldfile_open_command_file_1 (name, TRUE);
+}
+
 void
 ldfile_add_arch (const char *in_name)
 {
index bb62249992ea14118a69f007ba419109a2a0f0d0..e675be90d33ff03bffe3e8bcaeb7d085af8f0cd9 100644 (file)
@@ -50,6 +50,8 @@ extern void ldfile_add_library_path
   (const char *, bfd_boolean cmdline);
 extern void ldfile_open_command_file
   (const char *name);
+extern void ldfile_open_default_command_file
+  (const char *name);
 extern void ldfile_open_file
   (struct lang_input_statement_struct *);
 extern bfd_boolean ldfile_try_open_bfd
index 85b9c2b5b3eb0c8afd08953ce2bde3661b3f7213..7cb4fc9e99c6a6d3fab2dc3a1608494d19704de9 100644 (file)
@@ -376,7 +376,7 @@ main (int argc, char **argv)
       char *s = ldemul_get_script (&isfile);
 
       if (isfile)
-       ldfile_open_command_file (s);
+       ldfile_open_default_command_file (s);
       else
        {
          lex_string = s;