summaryrefslogtreecommitdiff
path: root/ld/ldfile.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@bigpond.net.au>2008-08-09 10:15:39 +0000
committerAlan Modra <amodra@bigpond.net.au>2008-08-09 10:15:39 +0000
commite6b5c9846ca9e1e6be5c1d4ce9075c9bc0cd911e (patch)
tree49e92408563518a45417ac22d4b2b22700d4a0f8 /ld/ldfile.c
parent0d05cc2205adb5b15078b373267c88fecf643749 (diff)
downloadbinutils-redhat-e6b5c9846ca9e1e6be5c1d4ce9075c9bc0cd911e.tar.gz
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.
Diffstat (limited to 'ld/ldfile.c')
-rw-r--r--ld/ldfile.c128
1 files changed, 116 insertions, 12 deletions
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;