From 6e31561f211107e43e66b8a4c494a7898d138f5c Mon Sep 17 00:00:00 2001 From: Kazu Hirata Date: Mon, 6 Apr 2009 00:47:09 +0000 Subject: [PATCH] * 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. --- ld/ChangeLog | 13 +++++++++++++ ld/ld.texinfo | 4 +++- ld/ldfile.c | 62 +++++++++++++++++++++++++++++++++++++++++++---------------- ld/ldfile.h | 2 ++ ld/ldmain.c | 2 +- 5 files changed, 64 insertions(+), 19 deletions(-) diff --git a/ld/ChangeLog b/ld/ChangeLog index 78605abf4c..e7df0814f7 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,16 @@ +2009-04-06 Kazu Hirata + + * 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 * ldlang.c (lang_leave_output_section_statement): Set lma_region diff --git a/ld/ld.texinfo b/ld/ld.texinfo index b6f0a0b00a..a7169d938f 100644 --- a/ld/ld.texinfo +++ b/ld/ld.texinfo @@ -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. diff --git a/ld/ldfile.c b/ld/ldfile.c index a24eae6c03..380b56ac68 100644 --- a/ld/ldfile.c +++ b/ld/ldfile.c @@ -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) { diff --git a/ld/ldfile.h b/ld/ldfile.h index bb62249992..e675be90d3 100644 --- a/ld/ldfile.h +++ b/ld/ldfile.h @@ -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 diff --git a/ld/ldmain.c b/ld/ldmain.c index 85b9c2b5b3..7cb4fc9e99 100644 --- a/ld/ldmain.c +++ b/ld/ldmain.c @@ -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; -- 2.11.0