From a8caa2450b3abe46aeec4ccd61ccc9b680ebb2ff Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Sat, 9 Aug 2008 10:15:39 +0000 Subject: [PATCH] PR 6753 * ldmain.c (check_for_scripts_dir, set_scripts_dir): Delete. (main): Don't set_scripts_dir here. * ldfile.c (check_for_scripts_dir, find_scripts_dir): New functions, largely based on ldmain.c versions. (ldfile_find_command_file): Set up search in script dir here without affecting library search. * Makefile.am (ldmain.o): No need to define SCRIPTDIR. (ldfile.o): New rule. * Makefile.in: Regenerate. --- ld/ChangeLog | 13 +++++ ld/Makefile.am | 8 +++- ld/Makefile.in | 8 +++- ld/ldfile.c | 128 ++++++++++++++++++++++++++++++++++++++++++++----- ld/ldmain.c | 106 ---------------------------------------- 5 files changed, 141 insertions(+), 122 deletions(-) diff --git a/ld/ChangeLog b/ld/ChangeLog index 94979e899e1..d7ff3c6d6c9 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,16 @@ +2008-08-09 Alan Modra + + PR 6753 + * ldmain.c (check_for_scripts_dir, set_scripts_dir): Delete. + (main): Don't set_scripts_dir here. + * ldfile.c (check_for_scripts_dir, find_scripts_dir): New functions, + largely based on ldmain.c versions. + (ldfile_find_command_file): Set up search in script dir here without + affecting library search. + * Makefile.am (ldmain.o): No need to define SCRIPTDIR. + (ldfile.o): New rule. + * Makefile.in: Regenerate. + 2008-08-08 Anatoly Sokolov * Makefile.am (ALL_EMULATIONS): Add eavr25.o, eavr31.o, eavr35.o, diff --git a/ld/Makefile.am b/ld/Makefile.am index 98000adb580..1584a245ee6 100644 --- a/ld/Makefile.am +++ b/ld/Makefile.am @@ -468,11 +468,15 @@ po/POTFILES.in: @MAINT@ Makefile ldmain.o: ldmain.c config.status $(COMPILE) -c -DDEFAULT_EMULATION='"$(EMUL)"' \ - -DSCRIPTDIR='"$(scriptdir)"' -DBINDIR='"$(bindir)"' \ - -DTOOLBINDIR='"$(tooldir)/bin"' \ + -DBINDIR='"$(bindir)"' -DTOOLBINDIR='"$(tooldir)/bin"' \ -DTARGET='"@target@"' @TARGET_SYSTEM_ROOT_DEFINE@ \ $(srcdir)/ldmain.c +ldfile.o: ldfile.c config.status + $(COMPILE) -c -DSCRIPTDIR='"$(scriptdir)"' \ + -DBINDIR='"$(bindir)"' -DTOOLBINDIR='"$(tooldir)/bin"' \ + $(srcdir)/ldfile.c + eelf32_spu.o: eelf32_spu.c $(COMPILE) -c -DEMBEDSPU="\"`echo embedspu | sed '$(transform)'`\"" \ eelf32_spu.c diff --git a/ld/Makefile.in b/ld/Makefile.in index eb41a516109..f96328c16e5 100644 --- a/ld/Makefile.in +++ b/ld/Makefile.in @@ -1304,11 +1304,15 @@ po/POTFILES.in: @MAINT@ Makefile ldmain.o: ldmain.c config.status $(COMPILE) -c -DDEFAULT_EMULATION='"$(EMUL)"' \ - -DSCRIPTDIR='"$(scriptdir)"' -DBINDIR='"$(bindir)"' \ - -DTOOLBINDIR='"$(tooldir)/bin"' \ + -DBINDIR='"$(bindir)"' -DTOOLBINDIR='"$(tooldir)/bin"' \ -DTARGET='"@target@"' @TARGET_SYSTEM_ROOT_DEFINE@ \ $(srcdir)/ldmain.c +ldfile.o: ldfile.c config.status + $(COMPILE) -c -DSCRIPTDIR='"$(scriptdir)"' \ + -DBINDIR='"$(bindir)"' -DTOOLBINDIR='"$(tooldir)/bin"' \ + $(srcdir)/ldfile.c + eelf32_spu.o: eelf32_spu.c $(COMPILE) -c -DEMBEDSPU="\"`echo embedspu | sed '$(transform)'`\"" \ eelf32_spu.c diff --git a/ld/ldfile.c b/ld/ldfile.c index 6337610782d..a24eae6c038 100644 --- a/ld/ldfile.c +++ b/ld/ldfile.c @@ -456,30 +456,134 @@ try_open (const char *name, const char *exten) return result; } -/* Try to open NAME; if that fails, look for it in any directories - specified with -L, without and with EXTEND appended. */ +/* Return TRUE iff directory DIR contains an "ldscripts" subdirectory. */ + +static bfd_boolean +check_for_scripts_dir (char *dir) +{ + char *buf; + struct stat s; + bfd_boolean res; + + buf = concat (dir, "/ldscripts", (const char *) NULL); + res = stat (buf, &s) == 0 && S_ISDIR (s.st_mode); + free (buf); + return res; +} + +/* Return the default directory for finding script files. + We look for the "ldscripts" directory in: + + SCRIPTDIR (passed from Makefile) + (adjusted according to the current location of the binary) + SCRIPTDIR (passed from Makefile) + the dir where this program is (for using it from the build tree) + the dir where this program is/../lib + (for installing the tool suite elsewhere). */ + +static char * +find_scripts_dir (void) +{ + char *end, *dir; + size_t dirlen; + + dir = make_relative_prefix (program_name, BINDIR, SCRIPTDIR); + if (dir) + { + if (check_for_scripts_dir (dir)) + return dir; + free (dir); + } + + dir = make_relative_prefix (program_name, TOOLBINDIR, SCRIPTDIR); + if (dir) + { + if (check_for_scripts_dir (dir)) + return dir; + free (dir); + } + + if (check_for_scripts_dir (SCRIPTDIR)) + /* We've been installed normally. */ + return SCRIPTDIR; + + /* Look for "ldscripts" in the dir where our binary is. */ + end = strrchr (program_name, '/'); +#ifdef HAVE_DOS_BASED_FILE_SYSTEM + { + /* We could have \foo\bar, or /foo\bar. */ + char *bslash = strrchr (program_name, '\\'); + + if (end == NULL || (bslash != NULL && bslash > end)) + end = bslash; + } +#endif + + if (end == NULL) + /* Don't look for ldscripts in the current directory. There is + too much potential for confusion. */ + return NULL; + + dirlen = end - program_name; + /* Make a copy of program_name in dir. + Leave room for later "/../lib". */ + dir = xmalloc (dirlen + sizeof ("/../lib")); + strncpy (dir, program_name, dirlen); + dir[dirlen] = '\0'; + + if (check_for_scripts_dir (dir)) + return dir; + + /* Look for "ldscripts" in /../lib. */ + strcpy (dir + dirlen, "/../lib"); + if (check_for_scripts_dir (dir)) + return dir; + free (dir); + 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. */ static FILE * ldfile_find_command_file (const char *name, const char *extend) { 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) + if (result != NULL) + return result; + + if (!script_search) { - /* Try now prefixes. */ - for (search = search_head; search != NULL; search = search->next) + char *script_dir = find_scripts_dir (); + if (script_dir) { - char *buffer; - - buffer = concat (search->name, slash, name, (const char *) NULL); - result = try_open (buffer, extend); - free (buffer); - if (result) - break; + search_dirs_type **save_tail_ptr = search_tail_ptr; + search_tail_ptr = &script_search; + 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; + } + + /* Try now prefixes. */ + for (search = script_search; search != NULL; search = search->next) + { + + buffer = concat (search->name, slash, name, (const char *) NULL); + result = try_open (buffer, extend); + free (buffer); + if (result) + break; } return result; diff --git a/ld/ldmain.c b/ld/ldmain.c index e7b9c0f9d5c..bf3c0e6ded2 100644 --- a/ld/ldmain.c +++ b/ld/ldmain.c @@ -114,8 +114,6 @@ static const char *get_sysroot (int, char **); static char *get_emulation (int, char **); -static void set_scripts_dir - (void); static bfd_boolean add_archive_element (struct bfd_link_info *, bfd *, const char *); static bfd_boolean multiple_definition @@ -358,10 +356,6 @@ main (int argc, char **argv) link_info.discard = discard_all; } - /* This essentially adds another -L directory so this must be done after - the -L's in argv have been processed. */ - set_scripts_dir (); - /* If we have not already opened and parsed a linker script, try the default script from command line first. */ if (saved_script_handle == NULL @@ -671,106 +665,6 @@ get_emulation (int argc, char **argv) return emulation; } -/* If directory DIR contains an "ldscripts" subdirectory, - add DIR to the library search path and return TRUE, - else return FALSE. */ - -static bfd_boolean -check_for_scripts_dir (char *dir) -{ - size_t dirlen; - char *buf; - struct stat s; - bfd_boolean res; - - dirlen = strlen (dir); - /* sizeof counts the terminating NUL. */ - buf = xmalloc (dirlen + sizeof ("/ldscripts")); - sprintf (buf, "%s/ldscripts", dir); - - res = stat (buf, &s) == 0 && S_ISDIR (s.st_mode); - free (buf); - if (res) - ldfile_add_library_path (dir, FALSE); - return res; -} - -/* Set the default directory for finding script files. - Libraries will be searched for here too, but that's ok. - We look for the "ldscripts" directory in: - - SCRIPTDIR (passed from Makefile) - (adjusted according to the current location of the binary) - SCRIPTDIR (passed from Makefile) - the dir where this program is (for using it from the build tree) - the dir where this program is/../lib - (for installing the tool suite elsewhere). */ - -static void -set_scripts_dir (void) -{ - char *end, *dir; - size_t dirlen; - bfd_boolean found; - - dir = make_relative_prefix (program_name, BINDIR, SCRIPTDIR); - if (dir) - { - found = check_for_scripts_dir (dir); - free (dir); - if (found) - return; - } - - dir = make_relative_prefix (program_name, TOOLBINDIR, SCRIPTDIR); - if (dir) - { - found = check_for_scripts_dir (dir); - free (dir); - if (found) - return; - } - - if (check_for_scripts_dir (SCRIPTDIR)) - /* We've been installed normally. */ - return; - - /* Look for "ldscripts" in the dir where our binary is. */ - end = strrchr (program_name, '/'); -#ifdef HAVE_DOS_BASED_FILE_SYSTEM - { - /* We could have \foo\bar, or /foo\bar. */ - char *bslash = strrchr (program_name, '\\'); - - if (end == NULL || (bslash != NULL && bslash > end)) - end = bslash; - } -#endif - - if (end == NULL) - /* Don't look for ldscripts in the current directory. There is - too much potential for confusion. */ - return; - - dirlen = end - program_name; - /* Make a copy of program_name in dir. - Leave room for later "/../lib". */ - dir = xmalloc (dirlen + 8); - strncpy (dir, program_name, dirlen); - dir[dirlen] = '\0'; - - if (check_for_scripts_dir (dir)) - { - free (dir); - return; - } - - /* Look for "ldscripts" in /../lib. */ - strcpy (dir + dirlen, "/../lib"); - check_for_scripts_dir (dir); - free (dir); -} - void add_ysym (const char *name) { -- 2.30.2