From 42e4cdcaad590536246866b0846ec279e124fa16 Mon Sep 17 00:00:00 2001 From: Khem Raj Date: Mon, 7 Dec 2015 23:41:45 +0000 Subject: [PATCH 38/46] Search target sysroot gcc version specific dirs with multilib. We install the gcc libraries (such as crtbegin.p) into //5.2.0/ which is a default search path for GCC (aka multi_suffix in the code below). is 'machine' in gcc's terminology. We use these directories so that multiple gcc versions could in theory co-exist on target. We only want to build one gcc-cross-canadian per arch and have this work for all multilibs. can be handled by mapping the multilib to the one used by gcc-cross-canadian, e.g. mips64-polkmllib32-linux is symlinked to by mips64-poky-linux. The default gcc search path in the target sysroot for a "lib64" mutlilib is: /lib32/mips64-poky-linux/5.2.0/ /lib32/../lib64/ /usr/lib32/mips64-poky-linux/5.2.0/ /usr/lib32/../lib64/ /lib32/ /usr/lib32/ which means that the lib32 crtbegin.o will be found and the lib64 ones will not which leads to compiler failures. This patch injects a multilib version of that path first so the lib64 binaries can be found first. With this change the search path becomes: /lib32/../lib64/mips64-poky-linux/5.2.0/ /lib32/mips64-poky-linux/5.2.0/ /lib32/../lib64/ /usr/lib32/../lib64/mips64-poky-linux/5.2.0/ /usr/lib32/mips64-poky-linux/5.2.0/ /usr/lib32/../lib64/ /lib32/ /usr/lib32/ Upstream-Status: Pending RP 2015/7/31 Signed-off-by: Khem Raj --- gcc/gcc.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/gcc/gcc.c b/gcc/gcc.c index 94c240e..2812819 100644 --- a/gcc/gcc.c +++ b/gcc/gcc.c @@ -2507,7 +2507,7 @@ for_each_path (const struct path_prefix *paths, if (path == NULL) { len = paths->max_len + extra_space + 1; - len += MAX (MAX (suffix_len, multi_os_dir_len), multiarch_len); + len += MAX ((suffix_len + multi_os_dir_len), multiarch_len); path = XNEWVEC (char, len); } @@ -2519,6 +2519,33 @@ for_each_path (const struct path_prefix *paths, /* Look first in MACHINE/VERSION subdirectory. */ if (!skip_multi_dir) { + if (!(pl->os_multilib ? skip_multi_os_dir : skip_multi_dir)) + { + const char *this_multi; + size_t this_multi_len; + + if (pl->os_multilib) + { + this_multi = multi_os_dir; + this_multi_len = multi_os_dir_len; + } + else + { + this_multi = multi_dir; + this_multi_len = multi_dir_len; + } + + /* Look in multilib MACHINE/VERSION subdirectory first */ + if (this_multi_len) + { + memcpy (path + len, this_multi, this_multi_len + 1); + memcpy (path + len + this_multi_len, multi_suffix, suffix_len + 1); + ret = callback (path, callback_info); + if (ret) + break; + } + } + memcpy (path + len, multi_suffix, suffix_len + 1); ret = callback (path, callback_info); if (ret) -- 2.8.2