summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Hatle <mark.hatle@kernel.crashing.org>2019-11-18 11:17:30 -0600
committerRichard Purdie <richard.purdie@linuxfoundation.org>2019-11-29 17:43:39 +0000
commit5507707f0d36a612992758dabd58d68a72ab0cfc (patch)
tree8d316d3a8a16b2c87ac7f0d8928b56c9c8eedd3b
parent47048bfd6416c6fdeb545f890f38d57a1390450e (diff)
downloadpoky-5507707f0d36a612992758dabd58d68a72ab0cfc.tar.gz
gcc-9.2: Update the relocation patch to add PREFIX/EXEC_PREFIX
Without relocating PREFIX/EXEC_PREFIX the system can not do runtime relocation for the path to the usr/lib/gcc directory, and other components. While this is not a normal or supported use-case it does work in the upstream gcc. This is difficult to test with the regular OE SDKs, as it requires running the components with the correct LD_LIBRARY_PATH and ld.so. Without this update, gcc will typically not be able to find the gcc provided include file for stddef.h and similar. This is due to certain relocations being based on the PREFIX and/or EXEC_PREFIX locations which are hardcoded at compilation time. (From OE-Core rev: b879fe730bc2cbce99704705cb53fa9ee958b311) Signed-off-by: Mark Hatle <mark.hatle@kernel.crashing.org> Signed-off-by: Ross Burton <ross.burton@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--meta/recipes-devtools/gcc/gcc-9.2/0025-handle-sysroot-support-for-nativesdk-gcc.patch185
1 files changed, 159 insertions, 26 deletions
diff --git a/meta/recipes-devtools/gcc/gcc-9.2/0025-handle-sysroot-support-for-nativesdk-gcc.patch b/meta/recipes-devtools/gcc/gcc-9.2/0025-handle-sysroot-support-for-nativesdk-gcc.patch
index ba62bc1fd3..2e7a444b58 100644
--- a/meta/recipes-devtools/gcc/gcc-9.2/0025-handle-sysroot-support-for-nativesdk-gcc.patch
+++ b/meta/recipes-devtools/gcc/gcc-9.2/0025-handle-sysroot-support-for-nativesdk-gcc.patch
@@ -24,22 +24,32 @@ Upstream-Status: Inappropriate
24RP 2015/7/28 24RP 2015/7/28
25 25
26Signed-off-by: Khem Raj <raj.khem@gmail.com> 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>
27--- 34---
28 gcc/cppdefault.c | 50 +++++++++++++++++++++++++++++++++++------------- 35 c-family/c-opts.c | 4 +--
29 gcc/cppdefault.h | 3 ++- 36 cppdefault.c | 63 +++++++++++++++++++++++++++++++++---------------------
30 gcc/gcc.c | 20 +++++++++++++------ 37 cppdefault.h | 13 ++++-------
31 3 files changed, 53 insertions(+), 20 deletions(-) 38 gcc.c | 20 ++++++++++++-----
39 incpath.c | 12 +++++-----
40 prefix.c | 4 +--
41 6 files changed, 68 insertions(+), 48 deletions(-)
32 42
33diff --git a/gcc/cppdefault.c b/gcc/cppdefault.c 43Index: gcc-9.2.0/gcc/cppdefault.c
34index 980e2bd47a7..39b6059efdc 100644 44===================================================================
35--- a/gcc/cppdefault.c 45--- gcc-9.2.0.orig/gcc/cppdefault.c
36+++ b/gcc/cppdefault.c 46+++ gcc-9.2.0/gcc/cppdefault.c
37@@ -35,6 +35,30 @@ 47@@ -35,6 +35,30 @@
38 # undef CROSS_INCLUDE_DIR 48 # undef CROSS_INCLUDE_DIR
39 #endif 49 #endif
40 50
41+static char GPLUSPLUS_INCLUDE_DIRVAR[4096] __attribute__ ((section (".gccrelocprefix"))) = GPLUSPLUS_INCLUDE_DIR; 51+static char GPLUSPLUS_INCLUDE_DIRVAR[4096] __attribute__ ((section (".gccrelocprefix"))) = GPLUSPLUS_INCLUDE_DIR;
42+static char GCC_INCLUDE_DIRVAR[4096] __attribute__ ((section (".gccrelocprefix"))) = GCC_INCLUDE_DIR; 52+char GCC_INCLUDE_DIRVAR[4096] __attribute__ ((section (".gccrelocprefix"))) = GCC_INCLUDE_DIR;
43+static char GPLUSPLUS_TOOL_INCLUDE_DIRVAR[4096] __attribute__ ((section (".gccrelocprefix"))) = GPLUSPLUS_TOOL_INCLUDE_DIR; 53+static char GPLUSPLUS_TOOL_INCLUDE_DIRVAR[4096] __attribute__ ((section (".gccrelocprefix"))) = GPLUSPLUS_TOOL_INCLUDE_DIR;
44+static char GPLUSPLUS_BACKWARD_INCLUDE_DIRVAR[4096] __attribute__ ((section (".gccrelocprefix"))) = GPLUSPLUS_BACKWARD_INCLUDE_DIR; 54+static char GPLUSPLUS_BACKWARD_INCLUDE_DIRVAR[4096] __attribute__ ((section (".gccrelocprefix"))) = GPLUSPLUS_BACKWARD_INCLUDE_DIR;
45+static char STANDARD_STARTFILE_PREFIX_2VAR[4096] __attribute__ ((section (".gccrelocprefix"))) = STANDARD_STARTFILE_PREFIX_2 GCC_INCLUDE_SUBDIR_TARGET; 55+static char STANDARD_STARTFILE_PREFIX_2VAR[4096] __attribute__ ((section (".gccrelocprefix"))) = STANDARD_STARTFILE_PREFIX_2 GCC_INCLUDE_SUBDIR_TARGET;
@@ -65,7 +75,7 @@ index 980e2bd47a7..39b6059efdc 100644
65 const struct default_include cpp_include_defaults[] 75 const struct default_include cpp_include_defaults[]
66 #ifdef INCLUDE_DEFAULTS 76 #ifdef INCLUDE_DEFAULTS
67 = INCLUDE_DEFAULTS; 77 = INCLUDE_DEFAULTS;
68@@ -42,38 +66,38 @@ const struct default_include cpp_include_defaults[] 78@@ -42,38 +66,38 @@ const struct default_include cpp_include
69 = { 79 = {
70 #ifdef GPLUSPLUS_INCLUDE_DIR 80 #ifdef GPLUSPLUS_INCLUDE_DIR
71 /* Pick up GNU C++ generic include files. */ 81 /* Pick up GNU C++ generic include files. */
@@ -113,7 +123,7 @@ index 980e2bd47a7..39b6059efdc 100644
113 /* A multilib suffix needs adding if different multilibs use 123 /* A multilib suffix needs adding if different multilibs use
114 different headers. */ 124 different headers. */
115 #ifdef SYSROOT_HEADERS_SUFFIX_SPEC 125 #ifdef SYSROOT_HEADERS_SUFFIX_SPEC
116@@ -85,16 +109,16 @@ const struct default_include cpp_include_defaults[] 126@@ -85,33 +109,24 @@ const struct default_include cpp_include
117 #endif 127 #endif
118 #ifdef CROSS_INCLUDE_DIR 128 #ifdef CROSS_INCLUDE_DIR
119 /* One place the target system's headers might be. */ 129 /* One place the target system's headers might be. */
@@ -134,10 +144,29 @@ index 980e2bd47a7..39b6059efdc 100644
134 #endif 144 #endif
135 { 0, 0, 0, 0, 0, 0 } 145 { 0, 0, 0, 0, 0, 0 }
136 }; 146 };
137diff --git a/gcc/cppdefault.h b/gcc/cppdefault.h 147 #endif /* no INCLUDE_DEFAULTS */
138index e2d96f1e760..29fa5f815c8 100644 148
139--- a/gcc/cppdefault.h 149-#ifdef GCC_INCLUDE_DIR
140+++ b/gcc/cppdefault.h 150-const char cpp_GCC_INCLUDE_DIR[] = GCC_INCLUDE_DIR;
151-const size_t cpp_GCC_INCLUDE_DIR_len = sizeof GCC_INCLUDE_DIR - 8;
152-#else
153-const char cpp_GCC_INCLUDE_DIR[] = "";
154-const size_t cpp_GCC_INCLUDE_DIR_len = 0;
155-#endif
156-
157 /* The configured prefix. */
158-const char cpp_PREFIX[] = PREFIX;
159-const size_t cpp_PREFIX_len = sizeof PREFIX - 1;
160-const char cpp_EXEC_PREFIX[] = STANDARD_EXEC_PREFIX;
161+char PREFIXVAR[4096] __attribute__ ((section (".gccrelocprefix"))) = PREFIX;
162+char EXEC_PREFIXVAR[4096] __attribute__ ((section (".gccrelocprefix"))) = STANDARD_EXEC_PREFIX;
163
164 /* This value is set by cpp_relocated at runtime */
165 const char *gcc_exec_prefix;
166Index: gcc-9.2.0/gcc/cppdefault.h
167===================================================================
168--- gcc-9.2.0.orig/gcc/cppdefault.h
169+++ gcc-9.2.0/gcc/cppdefault.h
141@@ -33,7 +33,8 @@ 170@@ -33,7 +33,8 @@
142 171
143 struct default_include 172 struct default_include
@@ -148,10 +177,31 @@ index e2d96f1e760..29fa5f815c8 100644
148 const char *const component; /* The component containing the directory 177 const char *const component; /* The component containing the directory
149 (see update_path in prefix.c) */ 178 (see update_path in prefix.c) */
150 const char cplusplus; /* Only look here if we're compiling C++. */ 179 const char cplusplus; /* Only look here if we're compiling C++. */
151diff --git a/gcc/gcc.c b/gcc/gcc.c 180@@ -50,17 +51,13 @@ struct default_include
152index 1a3704b2763..db0e2934038 100644 181 };
153--- a/gcc/gcc.c 182
154+++ b/gcc/gcc.c 183 extern const struct default_include cpp_include_defaults[];
184-extern const char cpp_GCC_INCLUDE_DIR[];
185-extern const size_t cpp_GCC_INCLUDE_DIR_len;
186+extern char GCC_INCLUDE_DIRVAR[] __attribute__ ((section (".gccrelocprefix")));
187
188 /* The configure-time prefix, i.e., the value supplied as the argument
189 to --prefix=. */
190-extern const char cpp_PREFIX[];
191+extern char PREFIXVAR[] __attribute__ ((section (".gccrelocprefix")));
192 /* The length of the configure-time prefix. */
193-extern const size_t cpp_PREFIX_len;
194-/* The configure-time execution prefix. This is typically the lib/gcc
195- subdirectory of cpp_PREFIX. */
196-extern const char cpp_EXEC_PREFIX[];
197+extern char EXEC_PREFIXVAR[] __attribute__ ((section (".gccrelocprefix")));
198 /* The run-time execution prefix. This is typically the lib/gcc
199 subdirectory of the actual installation. */
200 extern const char *gcc_exec_prefix;
201Index: gcc-9.2.0/gcc/gcc.c
202===================================================================
203--- gcc-9.2.0.orig/gcc/gcc.c
204+++ gcc-9.2.0/gcc/gcc.c
155@@ -253,6 +253,8 @@ FILE *report_times_to_file = NULL; 205@@ -253,6 +253,8 @@ FILE *report_times_to_file = NULL;
156 #endif 206 #endif
157 static const char *target_system_root = DEFAULT_TARGET_SYSTEM_ROOT; 207 static const char *target_system_root = DEFAULT_TARGET_SYSTEM_ROOT;
@@ -161,7 +211,7 @@ index 1a3704b2763..db0e2934038 100644
161 /* Nonzero means pass the updated target_system_root to the compiler. */ 211 /* Nonzero means pass the updated target_system_root to the compiler. */
162 212
163 static int target_system_root_changed; 213 static int target_system_root_changed;
164@@ -527,6 +529,7 @@ or with constant text in a single argument. 214@@ -527,6 +529,7 @@ or with constant text in a single argume
165 %G process LIBGCC_SPEC as a spec. 215 %G process LIBGCC_SPEC as a spec.
166 %R Output the concatenation of target_system_root and 216 %R Output the concatenation of target_system_root and
167 target_sysroot_suffix. 217 target_sysroot_suffix.
@@ -169,7 +219,7 @@ index 1a3704b2763..db0e2934038 100644
169 %S process STARTFILE_SPEC as a spec. A capital S is actually used here. 219 %S process STARTFILE_SPEC as a spec. A capital S is actually used here.
170 %E process ENDFILE_SPEC as a spec. A capital E is actually used here. 220 %E process ENDFILE_SPEC as a spec. A capital E is actually used here.
171 %C process CPP_SPEC as a spec. 221 %C process CPP_SPEC as a spec.
172@@ -1493,10 +1496,10 @@ static const char *gcc_libexec_prefix; 222@@ -1500,10 +1503,10 @@ static const char *gcc_libexec_prefix;
173 gcc_exec_prefix is set because, in that case, we know where the 223 gcc_exec_prefix is set because, in that case, we know where the
174 compiler has been installed, and use paths relative to that 224 compiler has been installed, and use paths relative to that
175 location instead. */ 225 location instead. */
@@ -184,7 +234,7 @@ index 1a3704b2763..db0e2934038 100644
184 234
185 /* For native compilers, these are well-known paths containing 235 /* For native compilers, these are well-known paths containing
186 components that may be provided by the system. For cross 236 components that may be provided by the system. For cross
187@@ -1504,9 +1507,9 @@ static const char *const standard_startfile_prefix = STANDARD_STARTFILE_PREFIX; 237@@ -1511,9 +1514,9 @@ static const char *const standard_startf
188 static const char *md_exec_prefix = MD_EXEC_PREFIX; 238 static const char *md_exec_prefix = MD_EXEC_PREFIX;
189 static const char *md_startfile_prefix = MD_STARTFILE_PREFIX; 239 static const char *md_startfile_prefix = MD_STARTFILE_PREFIX;
190 static const char *md_startfile_prefix_1 = MD_STARTFILE_PREFIX_1; 240 static const char *md_startfile_prefix_1 = MD_STARTFILE_PREFIX_1;
@@ -196,7 +246,7 @@ index 1a3704b2763..db0e2934038 100644
196 = STANDARD_STARTFILE_PREFIX_2; 246 = STANDARD_STARTFILE_PREFIX_2;
197 247
198 /* A relative path to be used in finding the location of tools 248 /* A relative path to be used in finding the location of tools
199@@ -5915,6 +5918,11 @@ do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part) 249@@ -5922,6 +5925,11 @@ do_spec_1 (const char *spec, int inswitc
200 } 250 }
201 break; 251 break;
202 252
@@ -208,6 +258,89 @@ index 1a3704b2763..db0e2934038 100644
208 case 'S': 258 case 'S':
209 value = do_spec_1 (startfile_spec, 0, NULL); 259 value = do_spec_1 (startfile_spec, 0, NULL);
210 if (value != 0) 260 if (value != 0)
211-- 261Index: gcc-9.2.0/gcc/c-family/c-opts.c
2122.22.1 262===================================================================
213 263--- gcc-9.2.0.orig/gcc/c-family/c-opts.c
264+++ gcc-9.2.0/gcc/c-family/c-opts.c
265@@ -1382,8 +1382,8 @@ add_prefixed_path (const char *suffix, i
266 size_t prefix_len, suffix_len;
267
268 suffix_len = strlen (suffix);
269- prefix = iprefix ? iprefix : cpp_GCC_INCLUDE_DIR;
270- prefix_len = iprefix ? strlen (iprefix) : cpp_GCC_INCLUDE_DIR_len;
271+ prefix = iprefix ? iprefix : GCC_INCLUDE_DIRVAR;
272+ prefix_len = iprefix ? strlen (iprefix) : strlen(GCC_INCLUDE_DIRVAR) - 7;
273
274 path = (char *) xmalloc (prefix_len + suffix_len + 1);
275 memcpy (path, prefix, prefix_len);
276Index: gcc-9.2.0/gcc/incpath.c
277===================================================================
278--- gcc-9.2.0.orig/gcc/incpath.c
279+++ gcc-9.2.0/gcc/incpath.c
280@@ -131,7 +131,7 @@ add_standard_paths (const char *sysroot,
281 int relocated = cpp_relocated ();
282 size_t len;
283
284- if (iprefix && (len = cpp_GCC_INCLUDE_DIR_len) != 0)
285+ if (iprefix && (len = strlen(GCC_INCLUDE_DIRVAR) - 7) != 0)
286 {
287 /* Look for directories that start with the standard prefix.
288 "Translate" them, i.e. replace /usr/local/lib/gcc... with
289@@ -145,7 +145,7 @@ add_standard_paths (const char *sysroot,
290 now. */
291 if (sysroot && p->add_sysroot)
292 continue;
293- if (!filename_ncmp (p->fname, cpp_GCC_INCLUDE_DIR, len))
294+ if (!filename_ncmp (p->fname, GCC_INCLUDE_DIRVAR, len))
295 {
296 char *str = concat (iprefix, p->fname + len, NULL);
297 if (p->multilib == 1 && imultilib)
298@@ -185,7 +185,7 @@ add_standard_paths (const char *sysroot,
299 free (sysroot_no_trailing_dir_separator);
300 }
301 else if (!p->add_sysroot && relocated
302- && !filename_ncmp (p->fname, cpp_PREFIX, cpp_PREFIX_len))
303+ && !filename_ncmp (p->fname, PREFIXVAR, strlen(PREFIXVAR)))
304 {
305 static const char *relocated_prefix;
306 char *ostr;
307@@ -202,12 +202,12 @@ add_standard_paths (const char *sysroot,
308 dummy = concat (gcc_exec_prefix, "dummy", NULL);
309 relocated_prefix
310 = make_relative_prefix (dummy,
311- cpp_EXEC_PREFIX,
312- cpp_PREFIX);
313+ EXEC_PREFIXVAR,
314+ PREFIXVAR);
315 free (dummy);
316 }
317 ostr = concat (relocated_prefix,
318- p->fname + cpp_PREFIX_len,
319+ p->fname + strlen(PREFIXVAR),
320 NULL);
321 str = update_path (ostr, p->component);
322 free (ostr);
323Index: gcc-9.2.0/gcc/prefix.c
324===================================================================
325--- gcc-9.2.0.orig/gcc/prefix.c
326+++ gcc-9.2.0/gcc/prefix.c
327@@ -72,7 +72,9 @@ License along with GCC; see the file COP
328 #include "prefix.h"
329 #include "common/common-target.h"
330
331-static const char *std_prefix = PREFIX;
332+static const char PREFIXVAR[4096] __attribute__ ((section (".gccrelocprefix"))) = PREFIX;
333+
334+static const char *std_prefix = PREFIXVAR;
335
336 static const char *get_key_value (char *);
337 static char *translate_name (char *);
338@@ -212,7 +214,7 @@ translate_name (char *name)
339 prefix = getenv (key);
340
341 if (prefix == 0)
342- prefix = PREFIX;
343+ prefix = PREFIXVAR;
344
345 /* We used to strip trailing DIR_SEPARATORs here, but that can
346 sometimes yield a result with no separator when one was coded