[PATCH] winegcc: fix cross linking on multiarch platforms

Andre Heider a.heider at gmail.com
Tue Nov 20 07:24:53 CST 2018


Hi,

On 20/11/2018 13:53, Jacek Caban wrote:
> Hi Andre,
> 
> On 11/20/18 1:10 PM, Andre Heider wrote:
>> 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;
>> +        }
> 
> 
> It seems to me that extending the existing loop that tries to replace 
> lib* path components would be better (it's the loop just a few lines 
> bellow the code that you modify).

Sure, I can do that, but doesn't that go against the idea of multiarch?

If your distro uses /lib/$triple it shouldn't use /lib[32|64]/$triple - 
at least I've never seen such a setup.

Or would that solve the issue on a setup I didn't yet encounter?

Regards,
Andre



More information about the wine-devel mailing list