* 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:
parent
53283f867b
commit
e22430578c
6 changed files with 86 additions and 39 deletions
13
ld/ChangeLog
13
ld/ChangeLog
|
@ -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.
|
||||||
|
|
4
ld/NEWS
4
ld/NEWS
|
@ -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.
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
94
ld/ldmain.c
94
ld/ldmain.c
|
@ -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
|
||||||
|
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)
|
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). */
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue