* 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.
This commit is contained in:
Alan Modra 2008-08-09 10:15:39 +00:00
parent 3979a37f37
commit a8caa2450b
5 changed files with 142 additions and 123 deletions

View 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,

View 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

View 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

View 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)
{
/* Try now prefixes. */
for (search = search_head; search != NULL; search = search->next)
{
char *buffer;
if (result != NULL)
return result;
buffer = concat (search->name, slash, name, (const char *) NULL);
result = try_open (buffer, extend);
free (buffer);
if (result)
break;
if (!script_search)
{
char *script_dir = find_scripts_dir ();
if (script_dir)
{
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;

View 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)
{