* ldmain.h (ld_sysroot): Change type to a constant string.

* ldmain.c (ld_sysroot): Likewise.
	(get_relative_sysroot, get_sysroot): New functions, adding command-line
	support for changing the sysroot.
	(main): Call the new functions.
	* lexsup.c (OPTION_SYSROOT): New.
	(ld_options): Add --sysroot.
	(parse_args): Add a dummy handler for it.
	* ld.texinfo (--sysroot): Document.
	* NEWS: Mention the new --sysroot option.
This commit is contained in:
Richard Sandiford 2005-01-19 11:42:49 +00:00
parent 53283f867b
commit e22430578c
6 changed files with 86 additions and 39 deletions

View file

@ -1,3 +1,16 @@
2005-01-19 Richard Sandiford <rsandifo@redhat.com>
* ldmain.h (ld_sysroot): Change type to a constant string.
* ldmain.c (ld_sysroot): Likewise.
(get_relative_sysroot, get_sysroot): New functions, adding command-line
support for changing the sysroot.
(main): Call the new functions.
* lexsup.c (OPTION_SYSROOT): New.
(ld_options): Add --sysroot.
(parse_args): Add a dummy handler for it.
* ld.texinfo (--sysroot): Document.
* NEWS: Mention the new --sysroot option.
2005-01-18 Alan Modra <amodra@bigpond.net.au> 2005-01-18 Alan Modra <amodra@bigpond.net.au>
* ldlang.c (section_already_linked): Adjust bfd_link_just_syms call. * ldlang.c (section_already_linked): Adjust bfd_link_just_syms call.

View file

@ -1,5 +1,9 @@
-*- text -*- -*- text -*-
* A new command-line option, --sysroot, can be used to override the
default sysroot location. It only applies to toolchains that were
configured using --with-sysroot.
* New linker script functions: ORIGIN() and LENGTH() which return information * New linker script functions: ORIGIN() and LENGTH() which return information
about a specified memory region. about a specified memory region.

View file

@ -1504,6 +1504,12 @@ many relocations. @var{count} defaults to a value of 32768.
Compute and display statistics about the operation of the linker, such Compute and display statistics about the operation of the linker, such
as execution time and memory usage. as execution time and memory usage.
@kindex --sysroot
@item --sysroot=@var{directory}
Use @var{directory} as the location of the sysroot, overriding the
configure-time default. This option is only supported by linkers
that were configured using @option{--with-sysroot}.
@kindex --traditional-format @kindex --traditional-format
@cindex traditional format @cindex traditional format
@item --traditional-format @item --traditional-format

View file

@ -68,7 +68,7 @@ const char *output_filename = "a.out";
char *program_name; char *program_name;
/* The prefix for system library directories. */ /* The prefix for system library directories. */
char *ld_sysroot; const char *ld_sysroot;
/* The canonical representation of ld_sysroot. */ /* The canonical representation of ld_sysroot. */
char * ld_canon_sysroot; char * ld_canon_sysroot;
@ -110,6 +110,8 @@ ld_config_type config;
sort_type sort_section; sort_type sort_section;
static const char *get_sysroot
(int, char **);
static char *get_emulation static char *get_emulation
(int, char **); (int, char **);
static void set_scripts_dir static void set_scripts_dir
@ -201,47 +203,18 @@ main (int argc, char **argv)
xatexit (remove_output); xatexit (remove_output);
#ifdef TARGET_SYSTEM_ROOT_RELOCATABLE /* Set up the sysroot directory. */
ld_sysroot = make_relative_prefix (program_name, BINDIR, ld_sysroot = get_sysroot (argc, argv);
TARGET_SYSTEM_ROOT); if (*ld_sysroot)
if (ld_sysroot)
{ {
struct stat s; if (*TARGET_SYSTEM_ROOT == 0)
int res = stat (ld_sysroot, &s) == 0 && S_ISDIR (s.st_mode);
if (!res)
{ {
free (ld_sysroot); einfo ("%P%F: this linker was not configured to use sysroots");
ld_sysroot = NULL; ld_sysroot = "";
} }
} else
if (! ld_sysroot)
{
ld_sysroot = make_relative_prefix (program_name, TOOLBINDIR,
TARGET_SYSTEM_ROOT);
if (ld_sysroot)
{
struct stat s;
int res = stat (ld_sysroot, &s) == 0 && S_ISDIR (s.st_mode);
if (!res)
{
free (ld_sysroot);
ld_sysroot = NULL;
}
}
}
if (! ld_sysroot)
#endif
ld_sysroot = TARGET_SYSTEM_ROOT;
if (ld_sysroot && *ld_sysroot)
ld_canon_sysroot = lrealpath (ld_sysroot); ld_canon_sysroot = lrealpath (ld_sysroot);
}
if (ld_canon_sysroot) if (ld_canon_sysroot)
ld_canon_sysroot_len = strlen (ld_canon_sysroot); ld_canon_sysroot_len = strlen (ld_canon_sysroot);
else else
@ -587,6 +560,51 @@ main (int argc, char **argv)
return 0; return 0;
} }
/* If the configured sysroot is relocatable, try relocating it based on
default prefix FROM. Return the relocated directory if it exists,
otherwise return null. */
static char *
get_relative_sysroot (const char *from ATTRIBUTE_UNUSED)
{
#ifdef TARGET_SYSTEM_ROOT_RELOCATABLE
char *path;
struct stat s;
path = make_relative_prefix (program_name, from, TARGET_SYSTEM_ROOT);
if (path)
{
if (stat (path, &s) == 0 && S_ISDIR (s.st_mode))
return path;
free (path);
}
#endif
return 0;
}
/* Return the sysroot directory. Return "" if no sysroot is being used. */
static const char *
get_sysroot (int argc, char **argv)
{
int i;
const char *path;
for (i = 1; i < argc; i++)
if (strncmp (argv[i], "--sysroot=", strlen ("--sysroot=")) == 0)
return argv[i] + strlen ("--sysroot=");
path = get_relative_sysroot (BINDIR);
if (path)
return path;
path = get_relative_sysroot (TOOLBINDIR);
if (path)
return path;
return TARGET_SYSTEM_ROOT;
}
/* We need to find any explicitly given emulation in order to initialize the /* We need to find any explicitly given emulation in order to initialize the
state that's needed by the lex&yacc argument parser (parse_args). */ state that's needed by the lex&yacc argument parser (parse_args). */

View file

@ -23,7 +23,7 @@
#define LDMAIN_H #define LDMAIN_H
extern char *program_name; extern char *program_name;
extern char *ld_sysroot; extern const char *ld_sysroot;
extern char *ld_canon_sysroot; extern char *ld_canon_sysroot;
extern int ld_canon_sysroot_len; extern int ld_canon_sysroot_len;
extern bfd *output_bfd; extern bfd *output_bfd;

View file

@ -71,6 +71,7 @@ enum option_values
OPTION_DEFSYM, OPTION_DEFSYM,
OPTION_DEMANGLE, OPTION_DEMANGLE,
OPTION_DYNAMIC_LINKER, OPTION_DYNAMIC_LINKER,
OPTION_SYSROOT,
OPTION_EB, OPTION_EB,
OPTION_EL, OPTION_EL,
OPTION_EMBEDDED_RELOCS, OPTION_EMBEDDED_RELOCS,
@ -233,6 +234,8 @@ static const struct ld_option ld_options[] =
{ {"library-path", required_argument, NULL, 'L'}, { {"library-path", required_argument, NULL, 'L'},
'L', N_("DIRECTORY"), N_("Add DIRECTORY to library search path"), 'L', N_("DIRECTORY"), N_("Add DIRECTORY to library search path"),
TWO_DASHES }, TWO_DASHES },
{ {"sysroot=<DIRECTORY>", required_argument, NULL, OPTION_SYSROOT},
'\0', NULL, N_("Override the default sysroot location"), TWO_DASHES },
{ {NULL, required_argument, NULL, '\0'}, { {NULL, required_argument, NULL, '\0'},
'm', N_("EMULATION"), N_("Set emulation"), ONE_DASH }, 'm', N_("EMULATION"), N_("Set emulation"), ONE_DASH },
{ {"print-map", no_argument, NULL, 'M'}, { {"print-map", no_argument, NULL, 'M'},
@ -747,6 +750,9 @@ parse_args (unsigned argc, char **argv)
case OPTION_DYNAMIC_LINKER: case OPTION_DYNAMIC_LINKER:
command_line.interpreter = optarg; command_line.interpreter = optarg;
break; break;
case OPTION_SYSROOT:
/* Already handled in ldmain.c. */
break;
case OPTION_EB: case OPTION_EB:
command_line.endian = ENDIAN_BIG; command_line.endian = ENDIAN_BIG;
break; break;