[PATCH] winegcc: fix cross linking on multiarch platforms
Andre Heider
a.heider at gmail.com
Tue Nov 20 06:10:19 CST 2018
If e.g. the 64bit libdir was set to /foo/lib/x86_64-linux-gnu/bar, winegcc
will now look for the 32bit libdir at /foo/lib/i386-linux-gnu/bar.
Signed-off-by: Andre Heider <a.heider at gmail.com>
---
Tested on non-standard prefixes like /opt/foo as well as more exotic
variations like Debian's wine-development package, which uses
/usr/lib/x86_64-linux-gnu/wine-development
and
/usr/lib/i386-linux-gnu/wine-development
tools/winegcc/winegcc.c | 40 ++++++++++++++++++++++++++++++----------
1 file changed, 30 insertions(+), 10 deletions(-)
diff --git a/tools/winegcc/winegcc.c b/tools/winegcc/winegcc.c
index 6b3b4b6aab..d463d7a4bf 100644
--- a/tools/winegcc/winegcc.c
+++ b/tools/winegcc/winegcc.c
@@ -444,6 +444,21 @@ static int check_platform( struct options *opts, const char *file )
return ret;
}
+static const char *get_multiarch_dir( enum target_cpu cpu )
+{
+ switch(cpu)
+ {
+ case CPU_x86: return "/i386-linux-gnu";
+ case CPU_x86_64: return "/x86_64-linux-gnu";
+ case CPU_ARM: return "/arm-linux-gnueabi";
+ case CPU_ARM64: return "/aarch64-linux-gnu";
+ case CPU_POWERPC: return "/powerpc-linux-gnu";
+ default:
+ assert(0);
+ return NULL;
+ }
+}
+
static char *get_lib_dir( struct options *opts )
{
static const char *stdlibpath[] = { LIBDIR, "/usr/lib", "/usr/local/lib", "/lib" };
@@ -471,19 +486,24 @@ static char *get_lib_dir( struct options *opts )
strcpy( p, bit_suffix );
strcat( p, libwine );
if (check_platform( opts, buffer )) goto found;
- switch(opts->target_cpu)
- {
- case CPU_x86: strcpy( p, "/i386-linux-gnu" ); break;
- case CPU_x86_64: strcpy( p, "/x86_64-linux-gnu" ); break;
- case CPU_ARM: strcpy( p, "/arm-linux-gnueabi" ); break;
- case CPU_ARM64: strcpy( p, "/aarch64-linux-gnu" ); break;
- case CPU_POWERPC: strcpy( p, "/powerpc-linux-gnu" ); break;
- default:
- assert(0);
- }
+ strcpy( p, get_multiarch_dir( opts->target_cpu ));
strcat( p, libwine );
if (check_platform( opts, buffer )) goto found;
+ /* try s/$build_cpu/$target_cpu/ on multiarch */
+ if (build_cpu != opts->target_cpu && (p = strstr( stdlibpath[i], get_multiarch_dir( build_cpu ) )))
+ {
+ char *suffix = p + strlen( get_multiarch_dir( build_cpu ) );
+ strcpy( buffer, stdlibpath[i] );
+ p = buffer + (p - stdlibpath[i]);
+ strcpy( p, get_multiarch_dir( opts->target_cpu ) );
+ p += strlen( get_multiarch_dir( opts->target_cpu ) );
+ strcpy( p, suffix );
+ while (p > buffer && p[-1] == '/') p--;
+ strcat( p, libwine );
+ if (check_platform( opts, buffer )) goto found;
+ }
+
strcpy( buffer, stdlibpath[i] );
p = buffer + strlen(buffer);
while (p > buffer && p[-1] == '/') p--;
--
2.19.1
More information about the wine-devel
mailing list