aboutsummaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
authorHans-Peter Nilsson <hp@bitrange.com>2014-10-15 03:03:59 +0200
committerHans-Peter Nilsson <hp@bitrange.com>2014-10-15 03:04:21 +0200
commitbfa234344327776fb3b16e8bfd9c8de6ec73ae31 (patch)
treea0b2c562aca0683ae56024a46aa2e908c82441c9 /ld
parentef1ab8e216a01d94a4cd23dc94363a78e2971b84 (diff)
downloadgdb-bfa234344327776fb3b16e8bfd9c8de6ec73ae31.zip
gdb-bfa234344327776fb3b16e8bfd9c8de6ec73ae31.tar.gz
gdb-bfa234344327776fb3b16e8bfd9c8de6ec73ae31.tar.bz2
If "=" is the first character in a ldscript input file, force a sysroot prefix.
* ldlang.c (lang_add_input_file): If the first character in the filename is '=', prepend the sysroot and force the context of that input file to non-sysroot. The "input_flags.sysrooted = 0" thing described in the comment is covered by the testsuite part ("root-anchored =-prefixed script inside"), but only observable for --with-sysroot configurations.
Diffstat (limited to 'ld')
-rw-r--r--ld/ChangeLog3
-rw-r--r--ld/ldlang.c20
2 files changed, 23 insertions, 0 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index dd7c75e..49a0a66 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,5 +1,8 @@
2014-10-15 Hans-Peter Nilsson <hp@axis.com>
+ * ldlang.c (lang_add_input_file): If the first character in the
+ filename is '=', prepend the sysroot and force the context of that
+ input file to non-sysroot.
* ld.texinfo (Options): When mentioning "=" and sysroot, mention
that --sysroot controls it, not only through the configuration.
(input files in linker scripts): When mentioning
diff --git a/ld/ldlang.c b/ld/ldlang.c
index 5960e5c..c4da07f 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -1118,6 +1118,26 @@ lang_add_input_file (const char *name,
lang_input_file_enum_type file_type,
const char *target)
{
+ if (name != NULL && *name == '=')
+ {
+ lang_input_statement_type *ret;
+ char *sysrooted_name
+ = concat (ld_sysroot, name + 1, (const char *) NULL);
+
+ /* We've now forcibly prepended the sysroot, making the input
+ file independent of the context. Therefore, temporarily
+ force a non-sysrooted context for this statement, so it won't
+ get the sysroot prepended again when opened. (N.B. if it's a
+ script, any child nodes with input files starting with "/"
+ will be handled as "sysrooted" as they'll be found to be
+ within the sysroot subdirectory.) */
+ unsigned int outer_sysrooted = input_flags.sysrooted;
+ input_flags.sysrooted = 0;
+ ret = new_afile (sysrooted_name, file_type, target, TRUE);
+ input_flags.sysrooted = outer_sysrooted;
+ return ret;
+ }
+
return new_afile (name, file_type, target, TRUE);
}