diff options
author | Richard Sandiford <rdsandiford@googlemail.com> | 2005-01-19 11:42:49 +0000 |
---|---|---|
committer | Richard Sandiford <rdsandiford@googlemail.com> | 2005-01-19 11:42:49 +0000 |
commit | e22430578c7bc54a36eb0a8cc0a083f5b4826998 (patch) | |
tree | 23f1a24cbe20dc77284ec48185ef5e5a6022b72e /ld/ldmain.c | |
parent | 53283f867b4157d728963a9699bce30e2d24f033 (diff) | |
download | gdb-e22430578c7bc54a36eb0a8cc0a083f5b4826998.zip gdb-e22430578c7bc54a36eb0a8cc0a083f5b4826998.tar.gz gdb-e22430578c7bc54a36eb0a8cc0a083f5b4826998.tar.bz2 |
* 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.
Diffstat (limited to 'ld/ldmain.c')
-rw-r--r-- | ld/ldmain.c | 94 |
1 files changed, 56 insertions, 38 deletions
diff --git a/ld/ldmain.c b/ld/ldmain.c index ca53251..2b58d63 100644 --- a/ld/ldmain.c +++ b/ld/ldmain.c @@ -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) - { - 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) + /* Set up the sysroot directory. */ + ld_sysroot = get_sysroot (argc, argv); + if (*ld_sysroot) { - ld_sysroot = make_relative_prefix (program_name, TOOLBINDIR, - TARGET_SYSTEM_ROOT); - - if (ld_sysroot) + if (*TARGET_SYSTEM_ROOT == 0) { - struct stat s; - int res = stat (ld_sysroot, &s) == 0 && S_ISDIR (s.st_mode); - - if (!res) - { - 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) -#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). */ |