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.
This commit is contained in:
parent
3979a37f37
commit
a8caa2450b
13
ld/ChangeLog
13
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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
130
ld/ldfile.c
130
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)
|
||||
{
|
||||
/* 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;
|
||||
|
|
106
ld/ldmain.c
106
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)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue