From bfa234344327776fb3b16e8bfd9c8de6ec73ae31 Mon Sep 17 00:00:00 2001 From: Hans-Peter Nilsson Date: Wed, 15 Oct 2014 03:03:59 +0200 Subject: 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. --- ld/ChangeLog | 3 +++ ld/ldlang.c | 20 ++++++++++++++++++++ 2 files changed, 23 insertions(+) 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 + * 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); } -- cgit v1.1