[PATCH] winegcc: fix cross linking on multiarch platforms
Jacek Caban
jacek at codeweavers.com
Tue Nov 20 06:53:30 CST 2018
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).
Thanks,
Jacek
More information about the wine-devel
mailing list