From f4a23d427dc7ac56aa4de7a8d29e899e936ce841 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Thu, 8 Mar 2012 05:29:33 +0000 Subject: [PATCH] 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. --- ld/ChangeLog | 22 +++++++++++++++ ld/ldfile.c | 88 +++++++++++++++++++----------------------------------------- ld/ldfile.h | 2 -- ld/ldlang.c | 7 ++--- ld/ldlang.h | 5 +--- ld/ldlex.h | 2 +- ld/ldlex.l | 6 ++++- 7 files changed, 60 insertions(+), 72 deletions(-) diff --git a/ld/ChangeLog b/ld/ChangeLog index 8446bc7..a0a0d2b 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,25 @@ +2012-03-08 Alan Modra + + 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 * ldlang.h (struct lang_input_statement_flags): New, extract from.. diff --git a/ld/ldfile.c b/ld/ldfile.c index b76f669..41ace36 100644 --- a/ld/ldfile.c +++ b/ld/ldfile.c @@ -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; diff --git a/ld/ldfile.h b/ld/ldfile.h index 1736aaf..9456092 100644 --- a/ld/ldfile.h +++ b/ld/ldfile.h @@ -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; diff --git a/ld/ldlang.c b/ld/ldlang.c index 650f4b7..a95d2a5 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -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 (); diff --git a/ld/ldlang.h b/ld/ldlang.h index 9ed3952..e36a066 100644 --- a/ld/ldlang.h +++ b/ld/ldlang.h @@ -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. diff --git a/ld/ldlex.h b/ld/ldlex.h index 1a2aa12..739a9b0 100644 --- a/ld/ldlex.h +++ b/ld/ldlex.h @@ -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); diff --git a/ld/ldlex.l b/ld/ldlex.l index 33dd83d..7da611f 100644 --- a/ld/ldlex.l +++ b/ld/ldlex.l @@ -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)); } -- 2.7.4