PR 6753
authorAlan Modra <amodra@gmail.com>
Sat, 9 Aug 2008 10:15:39 +0000 (10:15 +0000)
committerAlan Modra <amodra@gmail.com>
Sat, 9 Aug 2008 10:15:39 +0000 (10:15 +0000)
* 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
ld/Makefile.am
ld/Makefile.in
ld/ldfile.c
ld/ldmain.c

index 94979e899e1fdb313de5c4311124286a750a9b76..d7ff3c6d6c9b5524d37ae21179d0e31ff2362d22 100644 (file)
@@ -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,
index 98000adb5808e65c2f60d9204937843b699186a1..1584a245ee6c93c2614659eba0da0e2823acbd7f 100644 (file)
@@ -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
index eb41a51610903cd002c25e78f850a5ba0bc96597..f96328c16e50105a38a36257d390b5c507640f67 100644 (file)
@@ -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
index 6337610782d95841677959121f43d7724cacb9ce..a24eae6c038f46cba8443025c17bd7751aeee317 100644 (file)
@@ -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;
index e7b9c0f9d5cc6f3b4bb35c41fb9632da60486f7a..bf3c0e6ded2d158575bc789c8a39f85175ab81e5 100644 (file)
@@ -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)
 {