Alexandre Julliard : winegcc: Look for libraries in the architecture-specific directory.

Alexandre Julliard julliard at winehq.org
Wed Apr 28 16:18:47 CDT 2021


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Apr 28 11:42:40 2021 +0200

winegcc: Look for libraries in the architecture-specific directory.

Based on patches by Jacek Caban.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 tools/winegcc/winegcc.c | 85 +++++++++++++++++++++++++------------------------
 1 file changed, 43 insertions(+), 42 deletions(-)

diff --git a/tools/winegcc/winegcc.c b/tools/winegcc/winegcc.c
index bf72b612034..969daa0f96b 100644
--- a/tools/winegcc/winegcc.c
+++ b/tools/winegcc/winegcc.c
@@ -597,29 +597,6 @@ static strarray *get_link_args( struct options *opts, const char *output_name )
     return link_args;
 }
 
-/* check that file is a library for the correct platform */
-static int check_platform( struct options *opts, const char *file )
-{
-    int ret = 0, fd = open( file, O_RDONLY );
-    if (fd != -1)
-    {
-        unsigned char header[16];
-        if (read( fd, header, sizeof(header) ) == sizeof(header))
-        {
-            /* FIXME: only ELF is supported, platform is not checked beyond 32/64 */
-            if (!memcmp( header, "\177ELF", 4 ))
-            {
-                if (header[4] == 2)  /* 64-bit */
-                    ret = (opts->target_cpu == CPU_x86_64 || opts->target_cpu == CPU_ARM64);
-                else
-                    ret = (opts->target_cpu != CPU_x86_64 && opts->target_cpu != CPU_ARM64);
-            }
-        }
-        close( fd );
-    }
-    return ret;
-}
-
 static const char *get_multiarch_dir( enum target_cpu cpu )
 {
    switch(cpu)
@@ -635,17 +612,41 @@ static const char *get_multiarch_dir( enum target_cpu cpu )
    }
 }
 
+static const char *get_wine_arch_dir( enum target_cpu target_cpu, enum target_platform target_platform )
+{
+    const char *cpu;
+
+    switch (target_cpu)
+    {
+    case CPU_x86:     cpu = "i386";     break;
+    case CPU_x86_64:  cpu = "x86_64";   break;
+    case CPU_ARM:     cpu = "arm";      break;
+    case CPU_ARM64:   cpu = "aarch64";  break;
+    default: return "/wine";
+    }
+    switch (target_platform)
+    {
+    case PLATFORM_WINDOWS:
+    case PLATFORM_CYGWIN:
+    case PLATFORM_MINGW:
+        return strmake( "/wine/%s-windows", cpu );
+    default:
+        return strmake( "/wine/%s-unix", cpu );
+    }
+}
+
 static char *get_lib_dir( struct options *opts )
 {
     const char *stdlibpath[] = { libdir, LIBDIR, "/usr/lib", "/usr/local/lib", "/lib" };
-    static const char ntdll[] = "/wine/ntdll.so";
-    const char *bit_suffix, *other_bit_suffix, *build_multiarch, *target_multiarch;
+    const char *bit_suffix, *other_bit_suffix, *build_multiarch, *target_multiarch, *winecrt0;
     const char *root = opts->sysroot ? opts->sysroot : "";
     unsigned int i;
+    struct stat st;
     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";
+    winecrt0 = strmake( "%s/libwinecrt0.a", get_wine_arch_dir( opts->target_cpu, opts->target_platform ));
     build_multiarch = get_multiarch_dir( build_cpu );
     target_multiarch = get_multiarch_dir( opts->target_cpu );
     build_len = strlen( build_multiarch );
@@ -658,31 +659,31 @@ static char *get_lib_dir( struct options *opts )
 
         if (!stdlibpath[i]) continue;
         buffer = xmalloc( strlen(root) + strlen(stdlibpath[i]) +
-                          strlen("/arm-linux-gnueabi") + strlen(ntdll) + 1 );
+                          strlen("/arm-linux-gnueabi") + strlen(winecrt0) + 1 );
         strcpy( buffer, root );
         strcat( buffer, stdlibpath[i] );
         p = buffer + strlen(buffer);
         while (p > buffer && p[-1] == '/') p--;
-        strcpy( p, ntdll );
-        if (check_platform( opts, buffer )) goto found;
+        strcpy( p, winecrt0 );
+        if (!stat( buffer, &st )) goto found;
         if (p > buffer + 2 && (!memcmp( p - 2, "32", 2 ) || !memcmp( p - 2, "64", 2 )))
         {
             p -= 2;
-            strcpy( p, ntdll );
-            if (check_platform( opts, buffer )) goto found;
+            strcpy( p, winecrt0 );
+            if (!stat( buffer, &st )) goto found;
         }
         strcpy( p, bit_suffix );
-        strcat( p, ntdll );
-        if (check_platform( opts, buffer )) goto found;
+        strcat( p, winecrt0 );
+        if (!stat( buffer, &st )) goto found;
         strcpy( p, target_multiarch );
-        strcat( p, ntdll );
-        if (check_platform( opts, buffer )) goto found;
+        strcat( p, winecrt0 );
+        if (!stat( buffer, &st )) goto found;
 
         strcpy( buffer, root );
         strcat( buffer, stdlibpath[i] );
         p = buffer + strlen(buffer);
         while (p > buffer && p[-1] == '/') p--;
-        strcpy( p, ntdll );
+        strcpy( p, winecrt0 );
 
         /* try to fixup each parent dirs named lib, lib32 or lib64 with target bitness suffix */
         while (p > buffer)
@@ -696,7 +697,7 @@ static char *get_lib_dir( struct options *opts )
             {
                 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;
+                if (!stat( buffer, &st )) goto found;
                 memmove( p + build_len, p + target_len, strlen( p + target_len ) + 1 );
                 memcpy( p, build_multiarch, build_len );
             }
@@ -706,15 +707,15 @@ static char *get_lib_dir( struct options *opts )
             {
                 memmove( p + 6, p + 4, strlen( p + 4 ) + 1 );
                 memcpy( p + 4, bit_suffix, 2 );
-                if (check_platform( opts, buffer )) goto found;
+                if (!stat( buffer, &st )) goto found;
                 memmove( p + 4, p + 6, strlen( p + 6 ) + 1 );
             }
             else if (!memcmp( p + 4, other_bit_suffix, 2 ) && p[6] == '/')
             {
                 memcpy( p + 4, bit_suffix, 2 );
-                if (check_platform( opts, buffer )) goto found;
+                if (!stat( buffer, &st )) goto found;
                 memmove( p + 4, p + 6, strlen( p + 6 ) + 1 );
-                if (check_platform( opts, buffer )) goto found;
+                if (!stat( buffer, &st )) goto found;
                 memmove( p + 6, p + 4, strlen( p + 4 ) + 1 );
                 memcpy( p + 4, other_bit_suffix, 2 );
             }
@@ -724,7 +725,7 @@ static char *get_lib_dir( struct options *opts )
         continue;
 
     found:
-        buffer[strlen(buffer) - strlen(ntdll)] = 0;
+        buffer[strlen(buffer) - strlen(winecrt0)] = 0;
         return buffer;
     }
     return strmake( "%s%s", root, LIBDIR );
@@ -1148,14 +1149,14 @@ static void build(struct options* opts)
     {
         char *lib_dir = get_lib_dir( opts );
         lib_dirs = strarray_dup(opts->lib_dirs);
-        strarray_add( lib_dirs, strmake( "%s/wine", lib_dir ));
+        strarray_add( lib_dirs, strmake( "%s%s", lib_dir,
+                                         get_wine_arch_dir( opts->target_cpu, opts->target_platform )));
         strarray_add( lib_dirs, lib_dir );
     }
     else
     {
         lib_dirs = strarray_alloc();
         strarray_add(lib_dirs, strmake("%s/dlls", opts->wine_objdir));
-        strarray_add(lib_dirs, strmake("%s/libs/wine", opts->wine_objdir));
         strarray_addall(lib_dirs, opts->lib_dirs);
     }
 




More information about the wine-cvs mailing list