blob: 3958e9c212d1583ae1c98454106acd4ab5fddddc [file] [log] [blame]
Andrew Geisslerc926e172021-05-07 16:11:35 -05001From 35c084a051bcd6587ebc73e4acb045cb2bdf7e99 Mon Sep 17 00:00:00 2001
Andrew Geissler82c905d2020-04-13 13:39:40 -05002From: Khem Raj <raj.khem@gmail.com>
3Date: Mon, 7 Dec 2015 23:39:54 +0000
Andrew Geisslerc182c622020-05-15 14:13:32 -05004Subject: [PATCH] handle sysroot support for nativesdk-gcc
Andrew Geissler82c905d2020-04-13 13:39:40 -05005
6Being able to build a nativesdk gcc is useful, particularly in cases
7where the host compiler may be of an incompatible version (or a 32
8bit compiler is needed).
9
10Sadly, building nativesdk-gcc is not straight forward. We install
11nativesdk-gcc into a relocatable location and this means that its
12library locations can change. "Normal" sysroot support doesn't help
13in this case since the values of paths like "libdir" change, not just
14base root directory of the system.
15
16In order to handle this we do two things:
17
18a) Add %r into spec file markup which can be used for injected paths
19 such as SYSTEMLIBS_DIR (see gcc_multilib_setup()).
20b) Add other paths which need relocation into a .gccrelocprefix section
21 which the relocation code will notice and adjust automatically.
22
23Upstream-Status: Inappropriate
24RP 2015/7/28
25
26Signed-off-by: Khem Raj <raj.khem@gmail.com>
27
28Added PREFIXVAR and EXEC_PREFIXVAR to support runtime relocation. Without
29these as part of the gccrelocprefix the system can't do runtime relocation
30if the executable is moved. (These paths were missed in the original
31implementation.)
32
33Signed-off-by: Mark Hatle <mark.hatle@kernel.crashing.org>
34---
Andrew Geisslerc182c622020-05-15 14:13:32 -050035 gcc/c-family/c-opts.c | 4 +--
36 gcc/cppdefault.c | 63 ++++++++++++++++++++++++++-----------------
37 gcc/cppdefault.h | 13 ++++-----
38 gcc/gcc.c | 20 +++++++++-----
39 gcc/incpath.c | 12 ++++-----
40 gcc/prefix.c | 6 +++--
41 6 files changed, 70 insertions(+), 48 deletions(-)
Andrew Geissler82c905d2020-04-13 13:39:40 -050042
Andrew Geisslerc182c622020-05-15 14:13:32 -050043diff --git a/gcc/c-family/c-opts.c b/gcc/c-family/c-opts.c
Andrew Geisslerc926e172021-05-07 16:11:35 -050044index bd15b9cd902..2bd667e3f58 100644
Andrew Geisslerc182c622020-05-15 14:13:32 -050045--- a/gcc/c-family/c-opts.c
46+++ b/gcc/c-family/c-opts.c
Andrew Geisslerc926e172021-05-07 16:11:35 -050047@@ -1436,8 +1436,8 @@ add_prefixed_path (const char *suffix, incpath_kind chain)
Andrew Geisslerc182c622020-05-15 14:13:32 -050048 size_t prefix_len, suffix_len;
49
50 suffix_len = strlen (suffix);
51- prefix = iprefix ? iprefix : cpp_GCC_INCLUDE_DIR;
52- prefix_len = iprefix ? strlen (iprefix) : cpp_GCC_INCLUDE_DIR_len;
53+ prefix = iprefix ? iprefix : GCC_INCLUDE_DIRVAR;
54+ prefix_len = iprefix ? strlen (iprefix) : strlen(GCC_INCLUDE_DIRVAR) - 7;
55
56 path = (char *) xmalloc (prefix_len + suffix_len + 1);
57 memcpy (path, prefix, prefix_len);
58diff --git a/gcc/cppdefault.c b/gcc/cppdefault.c
Andrew Geisslerc926e172021-05-07 16:11:35 -050059index d54d6ce0076..784a92a0c24 100644
Andrew Geisslerc182c622020-05-15 14:13:32 -050060--- a/gcc/cppdefault.c
61+++ b/gcc/cppdefault.c
Andrew Geissler82c905d2020-04-13 13:39:40 -050062@@ -35,6 +35,30 @@
63 # undef CROSS_INCLUDE_DIR
64 #endif
65
66+static char GPLUSPLUS_INCLUDE_DIRVAR[4096] __attribute__ ((section (".gccrelocprefix"))) = GPLUSPLUS_INCLUDE_DIR;
67+char GCC_INCLUDE_DIRVAR[4096] __attribute__ ((section (".gccrelocprefix"))) = GCC_INCLUDE_DIR;
68+static char GPLUSPLUS_TOOL_INCLUDE_DIRVAR[4096] __attribute__ ((section (".gccrelocprefix"))) = GPLUSPLUS_TOOL_INCLUDE_DIR;
69+static char GPLUSPLUS_BACKWARD_INCLUDE_DIRVAR[4096] __attribute__ ((section (".gccrelocprefix"))) = GPLUSPLUS_BACKWARD_INCLUDE_DIR;
70+static char STANDARD_STARTFILE_PREFIX_2VAR[4096] __attribute__ ((section (".gccrelocprefix"))) = STANDARD_STARTFILE_PREFIX_2 GCC_INCLUDE_SUBDIR_TARGET;
71+#ifdef LOCAL_INCLUDE_DIR
72+static char LOCAL_INCLUDE_DIRVAR[4096] __attribute__ ((section (".gccrelocprefix"))) = LOCAL_INCLUDE_DIR;
73+#endif
74+#ifdef PREFIX_INCLUDE_DIR
75+static char PREFIX_INCLUDE_DIRVAR[4096] __attribute__ ((section (".gccrelocprefix"))) = PREFIX_INCLUDE_DIR;
76+#endif
77+#ifdef FIXED_INCLUDE_DIR
78+static char FIXED_INCLUDE_DIRVAR[4096] __attribute__ ((section (".gccrelocprefix"))) = FIXED_INCLUDE_DIR;
79+#endif
80+#ifdef CROSS_INCLUDE_DIR
81+static char CROSS_INCLUDE_DIRVAR[4096] __attribute__ ((section (".gccrelocprefix"))) = CROSS_INCLUDE_DIR;
82+#endif
83+#ifdef TOOL_INCLUDE_DIR
84+static char TOOL_INCLUDE_DIRVAR[4096] __attribute__ ((section (".gccrelocprefix"))) = TOOL_INCLUDE_DIR;
85+#endif
86+#ifdef NATIVE_SYSTEM_HEADER_DIR
87+static char NATIVE_SYSTEM_HEADER_DIRVAR[4096] __attribute__ ((section (".gccrelocprefix"))) = NATIVE_SYSTEM_HEADER_DIR;
88+#endif
89+
90 const struct default_include cpp_include_defaults[]
91 #ifdef INCLUDE_DEFAULTS
92 = INCLUDE_DEFAULTS;
Andrew Geisslerc926e172021-05-07 16:11:35 -050093@@ -42,17 +66,17 @@ const struct default_include cpp_include_defaults[]
Andrew Geissler82c905d2020-04-13 13:39:40 -050094 = {
95 #ifdef GPLUSPLUS_INCLUDE_DIR
96 /* Pick up GNU C++ generic include files. */
97- { GPLUSPLUS_INCLUDE_DIR, "G++", 1, 1,
98+ { GPLUSPLUS_INCLUDE_DIRVAR, "G++", 1, 1,
99 GPLUSPLUS_INCLUDE_DIR_ADD_SYSROOT, 0 },
100 #endif
101 #ifdef GPLUSPLUS_TOOL_INCLUDE_DIR
102 /* Pick up GNU C++ target-dependent include files. */
103- { GPLUSPLUS_TOOL_INCLUDE_DIR, "G++", 1, 1,
104+ { GPLUSPLUS_TOOL_INCLUDE_DIRVAR, "G++", 1, 1,
105 GPLUSPLUS_INCLUDE_DIR_ADD_SYSROOT, 1 },
106 #endif
107 #ifdef GPLUSPLUS_BACKWARD_INCLUDE_DIR
108 /* Pick up GNU C++ backward and deprecated include files. */
109- { GPLUSPLUS_BACKWARD_INCLUDE_DIR, "G++", 1, 1,
110+ { GPLUSPLUS_BACKWARD_INCLUDE_DIRVAR, "G++", 1, 1,
111 GPLUSPLUS_INCLUDE_DIR_ADD_SYSROOT, 0 },
112 #endif
Andrew Geisslerc926e172021-05-07 16:11:35 -0500113 #ifdef GPLUSPLUS_LIBCXX_INCLUDE_DIR
114@@ -62,23 +86,23 @@ const struct default_include cpp_include_defaults[]
115 #endif
Andrew Geissler82c905d2020-04-13 13:39:40 -0500116 #ifdef GCC_INCLUDE_DIR
117 /* This is the dir for gcc's private headers. */
118- { GCC_INCLUDE_DIR, "GCC", 0, 0, 0, 0 },
119+ { GCC_INCLUDE_DIRVAR, "GCC", 0, 0, 0, 0 },
120 #endif
121 #ifdef GCC_INCLUDE_SUBDIR_TARGET
122 /* This is the dir for gcc's private headers under the specified sysroot. */
123- { STANDARD_STARTFILE_PREFIX_2 GCC_INCLUDE_SUBDIR_TARGET, "GCC", 0, 0, 1, 0 },
124+ { STANDARD_STARTFILE_PREFIX_2VAR, "GCC", 0, 0, 1, 0 },
125 #endif
126 #ifdef LOCAL_INCLUDE_DIR
127 /* /usr/local/include comes before the fixincluded header files. */
128- { LOCAL_INCLUDE_DIR, 0, 0, 1, 1, 2 },
129- { LOCAL_INCLUDE_DIR, 0, 0, 1, 1, 0 },
130+ { LOCAL_INCLUDE_DIRVAR, 0, 0, 1, 1, 2 },
131+ { LOCAL_INCLUDE_DIRVAR, 0, 0, 1, 1, 0 },
132 #endif
133 #ifdef PREFIX_INCLUDE_DIR
134- { PREFIX_INCLUDE_DIR, 0, 0, 1, 0, 0 },
135+ { PREFIX_INCLUDE_DIRVAR, 0, 0, 1, 0, 0 },
136 #endif
137 #ifdef FIXED_INCLUDE_DIR
138 /* This is the dir for fixincludes. */
139- { FIXED_INCLUDE_DIR, "GCC", 0, 0, 0,
140+ { FIXED_INCLUDE_DIRVAR, "GCC", 0, 0, 0,
141 /* A multilib suffix needs adding if different multilibs use
142 different headers. */
143 #ifdef SYSROOT_HEADERS_SUFFIX_SPEC
Andrew Geisslerc926e172021-05-07 16:11:35 -0500144@@ -90,33 +114,24 @@ const struct default_include cpp_include_defaults[]
Andrew Geissler82c905d2020-04-13 13:39:40 -0500145 #endif
146 #ifdef CROSS_INCLUDE_DIR
147 /* One place the target system's headers might be. */
148- { CROSS_INCLUDE_DIR, "GCC", 0, 0, 0, 0 },
149+ { CROSS_INCLUDE_DIRVAR, "GCC", 0, 0, 0, 0 },
150 #endif
151 #ifdef TOOL_INCLUDE_DIR
152 /* Another place the target system's headers might be. */
153- { TOOL_INCLUDE_DIR, "BINUTILS", 0, 1, 0, 0 },
154+ { TOOL_INCLUDE_DIRVAR, "BINUTILS", 0, 1, 0, 0 },
155 #endif
156 #ifdef NATIVE_SYSTEM_HEADER_DIR
157 /* /usr/include comes dead last. */
158- { NATIVE_SYSTEM_HEADER_DIR, NATIVE_SYSTEM_HEADER_COMPONENT, 0, 0, 1, 2 },
159- { NATIVE_SYSTEM_HEADER_DIR, NATIVE_SYSTEM_HEADER_COMPONENT, 0, 0, 1, 0 },
160+ { NATIVE_SYSTEM_HEADER_DIRVAR, NATIVE_SYSTEM_HEADER_COMPONENT, 0, 0, 1, 2 },
161+ { NATIVE_SYSTEM_HEADER_DIRVAR, NATIVE_SYSTEM_HEADER_COMPONENT, 0, 0, 1, 0 },
162 #endif
163 { 0, 0, 0, 0, 0, 0 }
164 };
165 #endif /* no INCLUDE_DEFAULTS */
166
167-#ifdef GCC_INCLUDE_DIR
168-const char cpp_GCC_INCLUDE_DIR[] = GCC_INCLUDE_DIR;
169-const size_t cpp_GCC_INCLUDE_DIR_len = sizeof GCC_INCLUDE_DIR - 8;
170-#else
171-const char cpp_GCC_INCLUDE_DIR[] = "";
172-const size_t cpp_GCC_INCLUDE_DIR_len = 0;
173-#endif
174-
175 /* The configured prefix. */
176-const char cpp_PREFIX[] = PREFIX;
177-const size_t cpp_PREFIX_len = sizeof PREFIX - 1;
178-const char cpp_EXEC_PREFIX[] = STANDARD_EXEC_PREFIX;
179+char PREFIXVAR[4096] __attribute__ ((section (".gccrelocprefix"))) = PREFIX;
180+char EXEC_PREFIXVAR[4096] __attribute__ ((section (".gccrelocprefix"))) = STANDARD_EXEC_PREFIX;
181
182 /* This value is set by cpp_relocated at runtime */
183 const char *gcc_exec_prefix;
Andrew Geisslerc182c622020-05-15 14:13:32 -0500184diff --git a/gcc/cppdefault.h b/gcc/cppdefault.h
Andrew Geisslerc926e172021-05-07 16:11:35 -0500185index fd3c655db1c..20669ac427d 100644
Andrew Geisslerc182c622020-05-15 14:13:32 -0500186--- a/gcc/cppdefault.h
187+++ b/gcc/cppdefault.h
Andrew Geissler82c905d2020-04-13 13:39:40 -0500188@@ -33,7 +33,8 @@
189
190 struct default_include
191 {
192- const char *const fname; /* The name of the directory. */
193+ const char *fname; /* The name of the directory. */
194+
195 const char *const component; /* The component containing the directory
196 (see update_path in prefix.c) */
Andrew Geisslerc926e172021-05-07 16:11:35 -0500197 const char cplusplus; /* When this is non-zero, we should only
198@@ -55,17 +56,13 @@ struct default_include
Andrew Geissler82c905d2020-04-13 13:39:40 -0500199 };
200
201 extern const struct default_include cpp_include_defaults[];
202-extern const char cpp_GCC_INCLUDE_DIR[];
203-extern const size_t cpp_GCC_INCLUDE_DIR_len;
204+extern char GCC_INCLUDE_DIRVAR[] __attribute__ ((section (".gccrelocprefix")));
205
206 /* The configure-time prefix, i.e., the value supplied as the argument
207 to --prefix=. */
208-extern const char cpp_PREFIX[];
209+extern char PREFIXVAR[] __attribute__ ((section (".gccrelocprefix")));
210 /* The length of the configure-time prefix. */
211-extern const size_t cpp_PREFIX_len;
212-/* The configure-time execution prefix. This is typically the lib/gcc
213- subdirectory of cpp_PREFIX. */
214-extern const char cpp_EXEC_PREFIX[];
215+extern char EXEC_PREFIXVAR[] __attribute__ ((section (".gccrelocprefix")));
216 /* The run-time execution prefix. This is typically the lib/gcc
217 subdirectory of the actual installation. */
218 extern const char *gcc_exec_prefix;
Andrew Geisslerc182c622020-05-15 14:13:32 -0500219diff --git a/gcc/gcc.c b/gcc/gcc.c
Andrew Geisslerc926e172021-05-07 16:11:35 -0500220index 8737bae5353..aa6fbe43965 100644
Andrew Geisslerc182c622020-05-15 14:13:32 -0500221--- a/gcc/gcc.c
222+++ b/gcc/gcc.c
223@@ -252,6 +252,8 @@ FILE *report_times_to_file = NULL;
Andrew Geissler82c905d2020-04-13 13:39:40 -0500224 #endif
225 static const char *target_system_root = DEFAULT_TARGET_SYSTEM_ROOT;
226
227+static char target_relocatable_prefix[4096] __attribute__ ((section (".gccrelocprefix"))) = SYSTEMLIBS_DIR;
228+
229 /* Nonzero means pass the updated target_system_root to the compiler. */
230
231 static int target_system_root_changed;
Andrew Geisslerc926e172021-05-07 16:11:35 -0500232@@ -568,6 +570,7 @@ or with constant text in a single argument.
Andrew Geissler82c905d2020-04-13 13:39:40 -0500233 %G process LIBGCC_SPEC as a spec.
234 %R Output the concatenation of target_system_root and
235 target_sysroot_suffix.
236+ %r Output the base path target_relocatable_prefix
237 %S process STARTFILE_SPEC as a spec. A capital S is actually used here.
238 %E process ENDFILE_SPEC as a spec. A capital E is actually used here.
239 %C process CPP_SPEC as a spec.
Andrew Geisslerc926e172021-05-07 16:11:35 -0500240@@ -1621,10 +1624,10 @@ static const char *gcc_libexec_prefix;
Andrew Geissler82c905d2020-04-13 13:39:40 -0500241 gcc_exec_prefix is set because, in that case, we know where the
242 compiler has been installed, and use paths relative to that
243 location instead. */
244-static const char *const standard_exec_prefix = STANDARD_EXEC_PREFIX;
245-static const char *const standard_libexec_prefix = STANDARD_LIBEXEC_PREFIX;
246-static const char *const standard_bindir_prefix = STANDARD_BINDIR_PREFIX;
247-static const char *const standard_startfile_prefix = STANDARD_STARTFILE_PREFIX;
248+static char standard_exec_prefix[4096] __attribute__ ((section (".gccrelocprefix"))) = STANDARD_EXEC_PREFIX;
249+static char standard_libexec_prefix[4096] __attribute__ ((section (".gccrelocprefix"))) = STANDARD_LIBEXEC_PREFIX;
250+static char standard_bindir_prefix[4096] __attribute__ ((section (".gccrelocprefix"))) = STANDARD_BINDIR_PREFIX;
251+static char *const standard_startfile_prefix = STANDARD_STARTFILE_PREFIX;
252
253 /* For native compilers, these are well-known paths containing
254 components that may be provided by the system. For cross
Andrew Geisslerc926e172021-05-07 16:11:35 -0500255@@ -1632,9 +1635,9 @@ static const char *const standard_startfile_prefix = STANDARD_STARTFILE_PREFIX;
Andrew Geissler82c905d2020-04-13 13:39:40 -0500256 static const char *md_exec_prefix = MD_EXEC_PREFIX;
257 static const char *md_startfile_prefix = MD_STARTFILE_PREFIX;
258 static const char *md_startfile_prefix_1 = MD_STARTFILE_PREFIX_1;
259-static const char *const standard_startfile_prefix_1
260+static char standard_startfile_prefix_1[4096] __attribute__ ((section (".gccrelocprefix")))
261 = STANDARD_STARTFILE_PREFIX_1;
262-static const char *const standard_startfile_prefix_2
263+static char standard_startfile_prefix_2[4096] __attribute__ ((section (".gccrelocprefix")))
264 = STANDARD_STARTFILE_PREFIX_2;
265
266 /* A relative path to be used in finding the location of tools
Andrew Geisslerc926e172021-05-07 16:11:35 -0500267@@ -6564,6 +6567,11 @@ do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
Andrew Geissler82c905d2020-04-13 13:39:40 -0500268 }
269 break;
270
271+ case 'r':
272+ obstack_grow (&obstack, target_relocatable_prefix,
273+ strlen (target_relocatable_prefix));
274+ break;
275+
276 case 'S':
277 value = do_spec_1 (startfile_spec, 0, NULL);
278 if (value != 0)
Andrew Geisslerc182c622020-05-15 14:13:32 -0500279diff --git a/gcc/incpath.c b/gcc/incpath.c
Andrew Geisslerc926e172021-05-07 16:11:35 -0500280index fbfc0ce03b8..a82e543428b 100644
Andrew Geisslerc182c622020-05-15 14:13:32 -0500281--- a/gcc/incpath.c
282+++ b/gcc/incpath.c
283@@ -131,7 +131,7 @@ add_standard_paths (const char *sysroot, const char *iprefix,
Andrew Geissler82c905d2020-04-13 13:39:40 -0500284 int relocated = cpp_relocated ();
285 size_t len;
286
287- if (iprefix && (len = cpp_GCC_INCLUDE_DIR_len) != 0)
288+ if (iprefix && (len = strlen(GCC_INCLUDE_DIRVAR) - 7) != 0)
289 {
290 /* Look for directories that start with the standard prefix.
291 "Translate" them, i.e. replace /usr/local/lib/gcc... with
Andrew Geisslerc926e172021-05-07 16:11:35 -0500292@@ -146,7 +146,7 @@ add_standard_paths (const char *sysroot, const char *iprefix,
Andrew Geissler82c905d2020-04-13 13:39:40 -0500293 now. */
294 if (sysroot && p->add_sysroot)
295 continue;
296- if (!filename_ncmp (p->fname, cpp_GCC_INCLUDE_DIR, len))
297+ if (!filename_ncmp (p->fname, GCC_INCLUDE_DIRVAR, len))
298 {
299 char *str = concat (iprefix, p->fname + len, NULL);
300 if (p->multilib == 1 && imultilib)
Andrew Geisslerc926e172021-05-07 16:11:35 -0500301@@ -187,7 +187,7 @@ add_standard_paths (const char *sysroot, const char *iprefix,
Andrew Geissler82c905d2020-04-13 13:39:40 -0500302 free (sysroot_no_trailing_dir_separator);
303 }
304 else if (!p->add_sysroot && relocated
305- && !filename_ncmp (p->fname, cpp_PREFIX, cpp_PREFIX_len))
306+ && !filename_ncmp (p->fname, PREFIXVAR, strlen(PREFIXVAR)))
307 {
308 static const char *relocated_prefix;
309 char *ostr;
Andrew Geisslerc926e172021-05-07 16:11:35 -0500310@@ -204,12 +204,12 @@ add_standard_paths (const char *sysroot, const char *iprefix,
Andrew Geissler82c905d2020-04-13 13:39:40 -0500311 dummy = concat (gcc_exec_prefix, "dummy", NULL);
312 relocated_prefix
313 = make_relative_prefix (dummy,
314- cpp_EXEC_PREFIX,
315- cpp_PREFIX);
316+ EXEC_PREFIXVAR,
317+ PREFIXVAR);
318 free (dummy);
319 }
320 ostr = concat (relocated_prefix,
321- p->fname + cpp_PREFIX_len,
322+ p->fname + strlen(PREFIXVAR),
323 NULL);
324 str = update_path (ostr, p->component);
325 free (ostr);
Andrew Geisslerc182c622020-05-15 14:13:32 -0500326diff --git a/gcc/prefix.c b/gcc/prefix.c
Andrew Geisslerc926e172021-05-07 16:11:35 -0500327index 747c09de638..f728638dc65 100644
Andrew Geisslerc182c622020-05-15 14:13:32 -0500328--- a/gcc/prefix.c
329+++ b/gcc/prefix.c
330@@ -72,7 +72,9 @@ License along with GCC; see the file COPYING3. If not see
Andrew Geissler82c905d2020-04-13 13:39:40 -0500331 #include "prefix.h"
332 #include "common/common-target.h"
333
334-static const char *std_prefix = PREFIX;
Andrew Geissler6ce62a22020-11-30 19:58:47 -0600335+char PREFIXVAR1[4096] __attribute__ ((section (".gccrelocprefix"))) = PREFIX;
Andrew Geissler82c905d2020-04-13 13:39:40 -0500336+
Andrew Geissler6ce62a22020-11-30 19:58:47 -0600337+static const char *std_prefix = PREFIXVAR1;
Andrew Geissler82c905d2020-04-13 13:39:40 -0500338
339 static const char *get_key_value (char *);
340 static char *translate_name (char *);
341@@ -212,7 +214,7 @@ translate_name (char *name)
342 prefix = getenv (key);
343
344 if (prefix == 0)
345- prefix = PREFIX;
Andrew Geissler6ce62a22020-11-30 19:58:47 -0600346+ prefix = PREFIXVAR1;
Andrew Geissler82c905d2020-04-13 13:39:40 -0500347
348 /* We used to strip trailing DIR_SEPARATORs here, but that can
349 sometimes yield a result with no separator when one was coded