Andre Heider : winegcc: Fix cross linking on multiarch platforms.

Alexandre Julliard julliard at winehq.org
Wed Nov 21 16:08:06 CST 2018


Module: wine
Branch: master
Commit: 2dfff7e63c4fc6f97e83df448a2c2b8c4b9eedd5
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=2dfff7e63c4fc6f97e83df448a2c2b8c4b9eedd5

Author: Andre Heider <a.heider at gmail.com>
Date:   Wed Nov 21 13:33:52 2018 +0100

winegcc: Fix cross linking on multiarch platforms.

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>
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 tools/winegcc/winegcc.c | 44 +++++++++++++++++++++++++++++++++-----------
 1 file changed, 33 insertions(+), 11 deletions(-)

diff --git a/tools/winegcc/winegcc.c b/tools/winegcc/winegcc.c
index 6b3b4b6a..5136cf3 100644
--- a/tools/winegcc/winegcc.c
+++ b/tools/winegcc/winegcc.c
@@ -444,15 +444,35 @@ 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" };
     static const char libwine[] = "/libwine.so";
-    const char *bit_suffix, *other_bit_suffix;
+    const char *bit_suffix, *other_bit_suffix, *build_multiarch, *target_multiarch;
     unsigned int i;
+    size_t build_len, target_len;
 
     bit_suffix = opts->target_cpu == CPU_x86_64 || opts->target_cpu == CPU_ARM64 ? "64" : "32";
     other_bit_suffix = opts->target_cpu == CPU_x86_64 || opts->target_cpu == CPU_ARM64 ? "32" : "64";
+    build_multiarch = get_multiarch_dir( build_cpu );
+    target_multiarch = get_multiarch_dir( opts->target_cpu );
+    build_len = strlen( build_multiarch );
+    target_len = strlen( target_multiarch );
 
     for (i = 0; i < sizeof(stdlibpath)/sizeof(stdlibpath[0]); i++)
     {
@@ -471,16 +491,7 @@ 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, target_multiarch );
         strcat( p, libwine );
         if (check_platform( opts, buffer )) goto found;
 
@@ -495,6 +506,17 @@ static char *get_lib_dir( struct options *opts )
             p--;
             while (p > buffer && *p != '/') p--;
             if (*p != '/') break;
+
+            /* try s/$build_cpu/$target_cpu/ on multiarch */
+            if (build_cpu != opts->target_cpu && !memcmp( p, build_multiarch, build_len ) && p[build_len] == '/')
+            {
+                memmove( p + target_len, p + build_len, strlen( p + build_len ) + 1 );
+                memcpy( p, target_multiarch, target_len );
+                if (check_platform( opts, buffer )) goto found;
+                memmove( p + build_len, p + target_len, strlen( p + target_len ) + 1 );
+                memcpy( p, build_multiarch, build_len );
+            }
+
             if (memcmp( p + 1, "lib", 3 )) continue;
             if (p[4] == '/')
             {




More information about the wine-cvs mailing list