From: Kazu Hirata Date: Mon, 6 Apr 2009 00:47:09 +0000 (+0000) Subject: * ld.texinfo (-L): Mention that -L options do not affect how ld X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=7d24f02c67bc8efdcfc1806e1f39e045342ae90f;p=binutils-gdb.git * 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. --- diff --git a/ld/ChangeLog b/ld/ChangeLog index 78605abf4c6..e7df0814f74 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 b6f0a0b00ad..a7169d938f8 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 a24eae6c038..380b56ac68e 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 bb62249992e..e675be90d33 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 85b9c2b5b3e..7cb4fc9e99c 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;