PR ld/10340
authorAlan Modra <amodra@gmail.com>
Thu, 8 Mar 2012 05:29:33 +0000 (05:29 +0000)
committerAlan Modra <amodra@gmail.com>
Thu, 8 Mar 2012 05:29:33 +0000 (05:29 +0000)
* ldfile.c (is_sysrooted_pathname): Remove notsame param.
(ldfile_add_library_path): Don't set sysrooted flag.
(ldfile_open_file_search): Likewise, and don't copy them.
(try_open): Delete exten and code handling such.  Add sysrooted
param and return whether path is in sysroot.
(ldfile_find_command_file): Delete extend param.  Add sysrooted
param.  Rename local var.  Update try_open calls.
(ldfile_open_command_file_1): Pass sysrooted to lex_push_file.
* ldfile.h (search_dirs_type): Remove sysrooted field.
* ldlang.c (new_afile): Always set sysrooted from input_flags.
(load_symbols): Don't set input_flags.sysrooted.
* ldlang.h (struct lang_input_statement_flags): Revise sysrooted
comment.
* ldlex.h (lex_push_file): Update prototype.
* ldlex.l (sysrooted_stack): New array.
(EOF): Pop input_flags.sysrooted.
(lex_push_file): Add sysrooted param.  Save and set
input_flags.sysrooted.

ld/ChangeLog
ld/ldfile.c
ld/ldfile.h
ld/ldlang.c
ld/ldlang.h
ld/ldlex.h
ld/ldlex.l

index 8446bc772ddeb97f366bfa1a44ec72fdf7ce6cb3..a0a0d2b0c8d35440ea6ce8480a3c26c6e7e28850 100644 (file)
@@ -1,3 +1,25 @@
+2012-03-08  Alan Modra  <amodra@gmail.com>
+
+       PR ld/10340
+       * ldfile.c (is_sysrooted_pathname): Remove notsame param.
+       (ldfile_add_library_path): Don't set sysrooted flag.
+       (ldfile_open_file_search): Likewise, and don't copy them.
+       (try_open): Delete exten and code handling such.  Add sysrooted
+       param and return whether path is in sysroot.
+       (ldfile_find_command_file): Delete extend param.  Add sysrooted
+       param.  Rename local var.  Update try_open calls.
+       (ldfile_open_command_file_1): Pass sysrooted to lex_push_file.
+       * ldfile.h (search_dirs_type): Remove sysrooted field.
+       * ldlang.c (new_afile): Always set sysrooted from input_flags.
+       (load_symbols): Don't set input_flags.sysrooted.
+       * ldlang.h (struct lang_input_statement_flags): Revise sysrooted
+       comment.
+       * ldlex.h (lex_push_file): Update prototype.
+       * ldlex.l (sysrooted_stack): New array.
+       (EOF): Pop input_flags.sysrooted.
+       (lex_push_file): Add sysrooted param.  Save and set
+       input_flags.sysrooted.
+
 2012-03-06  Alan Modra  <amodra@gmail.com>
 
        * ldlang.h (struct lang_input_statement_flags): New, extract from..
index b76f669be1f8618ce99df9788dfe872289e805fe..41ace36f54372b1bc2e6e61d8b346444ae76fc68 100644 (file)
@@ -70,7 +70,7 @@ static search_arch_type **search_arch_tail_ptr = &search_arch_head;
    sub-directory of the sysroot directory.  */
 
 static bfd_boolean
-is_sysrooted_pathname (const char *name, bfd_boolean notsame)
+is_sysrooted_pathname (const char *name)
 {
   char *realname;
   int len;
@@ -82,18 +82,13 @@ is_sysrooted_pathname (const char *name, bfd_boolean notsame)
   realname = lrealpath (name);
   len = strlen (realname);
   result = FALSE;
-  if (len == ld_canon_sysroot_len)
-    result = !notsame;
-  else if (len > ld_canon_sysroot_len
-          && IS_DIR_SEPARATOR (realname[ld_canon_sysroot_len]))
+  if (len > ld_canon_sysroot_len
+      && IS_DIR_SEPARATOR (realname[ld_canon_sysroot_len]))
     {
-      result = TRUE;
       realname[ld_canon_sysroot_len] = '\0';
+      result = FILENAME_CMP (ld_canon_sysroot, realname) == 0;
     }
 
-  if (result)
-    result = FILENAME_CMP (ld_canon_sysroot, realname) == 0;
-
   free (realname);
   return result;
 }
@@ -118,15 +113,9 @@ ldfile_add_library_path (const char *name, bfd_boolean cmdline)
   /* If a directory is marked as honoring sysroot, prepend the sysroot path
      now.  */
   if (name[0] == '=')
-    {
-      new_dirs->name = concat (ld_sysroot, name + 1, (const char *) NULL);
-      new_dirs->sysrooted = TRUE;
-    }
+    new_dirs->name = concat (ld_sysroot, name + 1, (const char *) NULL);
   else
-    {
-      new_dirs->name = xstrdup (name);
-      new_dirs->sysrooted = is_sysrooted_pathname (name, FALSE);
-    }
+    new_dirs->name = xstrdup (name);
 }
 
 /* Try to open a BFD for a lang_input_statement.  */
@@ -364,12 +353,7 @@ ldfile_open_file_search (const char *arch,
          free (name);
        }
       else if (ldfile_try_open_bfd (entry->filename, entry))
-       {
-         entry->flags.sysrooted
-           = (IS_ABSOLUTE_PATH (entry->filename)
-              && is_sysrooted_pathname (entry->filename, TRUE));
-         return TRUE;
-       }
+       return TRUE;
 
       if (IS_ABSOLUTE_PATH (entry->filename))
        return FALSE;
@@ -382,10 +366,7 @@ ldfile_open_file_search (const char *arch,
       if (entry->flags.dynamic && ! link_info.relocatable)
        {
          if (ldemul_open_dynamic_archive (arch, search, entry))
-           {
-             entry->flags.sysrooted = search->sysrooted;
-             return TRUE;
-           }
+           return TRUE;
        }
 
       if (entry->flags.maybe_archive)
@@ -398,7 +379,6 @@ ldfile_open_file_search (const char *arch,
       if (ldfile_try_open_bfd (string, entry))
        {
          entry->filename = string;
-         entry->flags.sysrooted = search->sysrooted;
          return TRUE;
        }
 
@@ -473,15 +453,18 @@ ldfile_open_file (lang_input_statement_type *entry)
     }
 }
 
-/* Try to open NAME; if that fails, try NAME with EXTEN appended to it.  */
+/* Try to open NAME.  */
 
 static FILE *
-try_open (const char *name, const char *exten)
+try_open (const char *name, bfd_boolean *sysrooted)
 {
   FILE *result;
 
   result = fopen (name, "r");
 
+  if (result != NULL)
+    *sysrooted = is_sysrooted_pathname (name);
+
   if (trace_file_tries)
     {
       if (result == NULL)
@@ -490,26 +473,6 @@ try_open (const char *name, const char *exten)
        info_msg (_("opened script file %s\n"), name);
     }
 
-  if (result != NULL)
-    return result;
-
-  if (*exten)
-    {
-      char *buff;
-
-      buff = concat (name, exten, (const char *) NULL);
-      result = fopen (buff, "r");
-
-      if (trace_file_tries)
-       {
-         if (result == NULL)
-           info_msg (_("cannot find script file %s\n"), buff);
-         else
-           info_msg (_("opened script file %s\n"), buff);
-       }
-      free (buff);
-    }
-
   return result;
 }
 
@@ -570,22 +533,23 @@ find_scripts_dir (void)
 
 /* 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.  */
+   directory.  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,
-                         bfd_boolean default_only)
+ldfile_find_command_file (const char *name,
+                         bfd_boolean default_only,
+                         bfd_boolean *sysrooted)
 {
   search_dirs_type *search;
   FILE *result = NULL;
-  char *buffer;
+  char *path;
   static search_dirs_type *script_search;
 
   if (!default_only)
     {
       /* First try raw name.  */
-      result = try_open (name, "");
+      result = try_open (name, sysrooted);
       if (result != NULL)
        return result;
     }
@@ -611,9 +575,9 @@ ldfile_find_command_file (const char *name, const char *extend,
        search != NULL;
        search = search->next)
     {
-      buffer = concat (search->name, slash, name, (const char *) NULL);
-      result = try_open (buffer, extend);
-      free (buffer);
+      path = concat (search->name, slash, name, (const char *) NULL);
+      result = try_open (path, sysrooted);
+      free (path);
       if (result)
        break;
     }
@@ -630,7 +594,9 @@ 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, "", default_only);
+  bfd_boolean sysrooted;
+
+  ldlex_input_stack = ldfile_find_command_file (name, default_only, &sysrooted);
 
   if (ldlex_input_stack == NULL)
     {
@@ -638,7 +604,7 @@ ldfile_open_command_file_1 (const char *name, bfd_boolean default_only)
       einfo (_("%P%F: cannot open linker script file %s: %E\n"), name);
     }
 
-  lex_push_file (ldlex_input_stack, name);
+  lex_push_file (ldlex_input_stack, name, sysrooted);
 
   lineno = 1;
 
index 1736aafe7400650d39ebdeb246f63726e9a5e931..945609250afc6fede2985dbdd59bf035cb835843 100644 (file)
@@ -37,8 +37,6 @@ typedef struct search_dirs {
   const char *name;
   /* TRUE if this is from the command line.  */
   bfd_boolean cmdline;
-  /* true if this is from within the sys-root.  */
-  bfd_boolean sysrooted;
 } search_dirs_type;
 
 extern search_dirs_type *search_head;
index 650f4b79d2adb0dee09c8eaf0d6fb5fe477c4e10..a95d2a58fea3458c3b2465d31e65a8dcbf0483ba 100644 (file)
@@ -1064,6 +1064,7 @@ new_afile (const char *name,
   p->flags.add_DT_NEEDED_for_dynamic = input_flags.add_DT_NEEDED_for_dynamic;
   p->flags.add_DT_NEEDED_for_regular = input_flags.add_DT_NEEDED_for_regular;
   p->flags.whole_archive = input_flags.whole_archive;
+  p->flags.sysrooted = input_flags.sysrooted;
 
   if (file_type == lang_input_file_is_l_enum
       && name[0] == ':' && name[1] != '\0')
@@ -1101,7 +1102,6 @@ new_afile (const char *name,
       p->local_sym_name = name;
       p->flags.real = TRUE;
       p->flags.search_dirs = TRUE;
-      p->flags.sysrooted = input_flags.sysrooted;
       break;
     case lang_input_file_is_file_enum:
       p->filename = name;
@@ -2716,7 +2716,6 @@ load_symbols (lang_input_statement_type *entry,
       ldfile_open_command_file (entry->filename);
 
       push_stat_ptr (place);
-      input_flags.sysrooted = entry->flags.sysrooted;
       input_flags.add_DT_NEEDED_for_regular
        = entry->flags.add_DT_NEEDED_for_regular;
       input_flags.add_DT_NEEDED_for_dynamic
@@ -2729,7 +2728,9 @@ load_symbols (lang_input_statement_type *entry,
       yyparse ();
       ldfile_assumed_script = FALSE;
 
-      /* missing_file is sticky.  */
+      /* missing_file is sticky.  sysrooted will already have been
+        restored when seeing EOF in yyparse, but no harm to restore
+        again.  */
       save_flags.missing_file |= input_flags.missing_file;
       input_flags = save_flags;
       pop_stat_ptr ();
index 9ed3952c4b221d927a4f68451685e8b3ad791b23..e36a0664c2a10a16fe3568b50b50922fe2abb052 100644 (file)
@@ -236,10 +236,7 @@ struct lang_input_statement_flags
   /* 1 means search a set of directories for this file.  */
   unsigned int search_dirs : 1;
 
-  /* 1 means this was found in a search directory marked as sysrooted,
-     if search_dirs is false, otherwise, that it should be
-     searched in ld_sysroot before any other location, as long as it
-     starts with a slash.  */
+  /* 1 means this was found when processing a script in the sysroot.  */
   unsigned int sysrooted : 1;
 
   /* 1 means this is base file of incremental load.
index 1a2aa122446835d2430f0a8488a29476de5e8594..739a9b0b9ac760a0c75ab056e9cac4d19b0ca8bd 100644 (file)
@@ -41,7 +41,7 @@ extern const char *lex_string;
 
 /* In ldlex.l.  */
 extern int yylex (void);
-extern void lex_push_file (FILE *, const char *);
+extern void lex_push_file (FILE *, const char *, unsigned int);
 extern void lex_redirect (const char *, const char *, unsigned int);
 extern void ldlex_script (void);
 extern void ldlex_mri_script (void);
index 33dd83d66fd2338a20f97657e5c5b36db8bf8c8f..7da611fd70f401d9a0cd3489f523c2f0925ba50e 100644 (file)
@@ -68,6 +68,7 @@ const char *lex_string = NULL;
 static YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
 static const char *file_name_stack[MAX_INCLUDE_DEPTH];
 static unsigned int lineno_stack[MAX_INCLUDE_DEPTH];
+static unsigned int sysrooted_stack[MAX_INCLUDE_DEPTH];
 static unsigned int include_stack_ptr = 0;
 static int vers_node_nesting = 0;
 
@@ -454,6 +455,7 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)*
     yy_switch_to_buffer (include_stack[include_stack_ptr]);
 
   lineno = lineno_stack[include_stack_ptr];
+  input_flags.sysrooted = sysrooted_stack[include_stack_ptr];
 
   return END;
 }
@@ -468,7 +470,7 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)*
    saving the current input info on the include stack.  */
 
 void
-lex_push_file (FILE *file, const char *name)
+lex_push_file (FILE *file, const char *name, unsigned int sysrooted)
 {
   if (include_stack_ptr >= MAX_INCLUDE_DEPTH)
     {
@@ -476,10 +478,12 @@ lex_push_file (FILE *file, const char *name)
     }
   file_name_stack[include_stack_ptr] = name;
   lineno_stack[include_stack_ptr] = lineno;
+  sysrooted_stack[include_stack_ptr] = input_flags.sysrooted;
   include_stack[include_stack_ptr] = YY_CURRENT_BUFFER;
 
   include_stack_ptr++;
   lineno = 1;
+  input_flags.sysrooted = sysrooted;
   yyin = file;
   yy_switch_to_buffer (yy_create_buffer (yyin, YY_BUF_SIZE));
 }