* 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>
* ldlang.c (section_already_linked): Adjust bfd_link_just_syms call.

View file

@ -1,5 +1,9 @@
-*- 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
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
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
@cindex traditional format
@item --traditional-format

View file

@ -68,7 +68,7 @@ const char *output_filename = "a.out";
char *program_name;
/* The prefix for system library directories. */
char *ld_sysroot;
const char *ld_sysroot;
/* The canonical representation of ld_sysroot. */
char * ld_canon_sysroot;
@ -110,6 +110,8 @@ ld_config_type config;
sort_type sort_section;
static const char *get_sysroot
(int, char **);
static char *get_emulation
(int, char **);
static void set_scripts_dir
@ -201,47 +203,18 @@ main (int argc, char **argv)
xatexit (remove_output);
#ifdef TARGET_SYSTEM_ROOT_RELOCATABLE
ld_sysroot = make_relative_prefix (program_name, BINDIR,
TARGET_SYSTEM_ROOT);
if (ld_sysroot)
/* Set up the sysroot directory. */
ld_sysroot = get_sysroot (argc, argv);
if (*ld_sysroot)
{
struct stat s;
int res = stat (ld_sysroot, &s) == 0 && S_ISDIR (s.st_mode);
if (!res)
if (*TARGET_SYSTEM_ROOT == 0)
{
free (ld_sysroot);
ld_sysroot = NULL;
einfo ("%P%F: this linker was not configured to use sysroots");
ld_sysroot = "";
}
else
ld_canon_sysroot = lrealpath (ld_sysroot);
}
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);
if (ld_canon_sysroot)
ld_canon_sysroot_len = strlen (ld_canon_sysroot);
else
@ -587,6 +560,51 @@ main (int argc, char **argv)
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
state that's needed by the lex&yacc argument parser (parse_args). */

View file

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

View file

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