From 16a326bcd126b395b29019072905bae7a5d47500 Mon Sep 17 00:00:00 2001 From: Khem Raj Date: Mon, 7 Dec 2015 23:41:45 +0000 Subject: [PATCH 37/47] 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 e015c77f15f..84af5d5a2e1 100644 --- a/gcc/gcc.c +++ b/gcc/gcc.c @@ -2533,7 +2533,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); } @@ -2545,6 +2545,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.12.2