summaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
Diffstat (limited to 'ld')
-rw-r--r--ld/ChangeLog13
-rw-r--r--ld/Makefile.am8
-rw-r--r--ld/Makefile.in8
-rw-r--r--ld/ldfile.c128
-rw-r--r--ld/ldmain.c106
5 files changed, 141 insertions, 122 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 94979e899e..d7ff3c6d6c 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,16 @@
+2008-08-09 Alan Modra <amodra@bigpond.net.au>
+
+ 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 <aesok@post.ru>
* Makefile.am (ALL_EMULATIONS): Add eavr25.o, eavr31.o, eavr35.o,
diff --git a/ld/Makefile.am b/ld/Makefile.am
index 98000adb58..1584a245ee 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 eb41a51610..f96328c16e 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 6337610782..a24eae6c03 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 <the dir where our binary is>/../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 e7b9c0f9d5..bf3c0e6ded 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 <the dir where our binary is>/../lib. */
- strcpy (dir + dirlen, "/../lib");
- check_for_scripts_dir (dir);
- free (dir);
-}
-
void
add_ysym (const char *name)
{