diff --git a/configure b/configure index 793f5a1a38b..f6535b8e751 100755 --- a/configure +++ b/configure @@ -712,7 +712,6 @@ LDD LDRPATH_LOCAL LDRPATH_INSTALL IMPLIBEXT -LDDLLFLAGS DLLFLAGS DLLEXT CPP @@ -6411,8 +6410,6 @@ DLLEXT="" DLLFLAGS="-D_REENTRANT" -LDDLLFLAGS="" - IMPLIBEXT="def" LDRPATH_INSTALL="" @@ -6699,7 +6696,6 @@ clean:: DLLEXT=".so" LIBEXT="dylib" DLLFLAGS="$DLLFLAGS -fPIC" - LDDLLFLAGS="-bundle -multiply_defined suppress" LIBWINE_LDFLAGS="-multiply_defined suppress" LDRPATH_INSTALL="-Wl,-rpath,@loader_path/\`\$(RELPATH) \$(bindir) \$(libdir)\`" LDRPATH_LOCAL="-Wl,-rpath,@loader_path/\$(top_builddir)/libs/wine" @@ -6807,10 +6803,6 @@ done LIBS="$ac_save_LIBS" fi - case $host_cpu in - *powerpc*) - LDDLLFLAGS="$LDDLLFLAGS -read_only_relocs warning" ;; - esac if test "$ac_cv_header_QuickTime_ImageCompression_h" = "yes" then QUICKTIMELIB="-framework QuickTime -framework ApplicationServices -framework CoreVideo" @@ -6907,57 +6899,6 @@ clean:: linux-android*) DLLFLAGS="$DLLFLAGS -fPIC" DLLEXT=".so" - LDDLLFLAGS="-shared -Wl,-Bsymbolic" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -fPIC -shared -Wl,-Bsymbolic,-z,defs" >&5 -$as_echo_n "checking whether the compiler supports -fPIC -shared -Wl,-Bsymbolic,-z,defs... " >&6; } -if ${ac_cv_cflags__fPIC__shared__Wl__Bsymbolic__z_defs+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_wine_try_cflags_saved=$CFLAGS -CFLAGS="$CFLAGS -fPIC -shared -Wl,-Bsymbolic,-z,defs" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int main(int argc, char **argv) { return 0; } -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_cflags__fPIC__shared__Wl__Bsymbolic__z_defs=yes -else - ac_cv_cflags__fPIC__shared__Wl__Bsymbolic__z_defs=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -CFLAGS=$ac_wine_try_cflags_saved -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__fPIC__shared__Wl__Bsymbolic__z_defs" >&5 -$as_echo "$ac_cv_cflags__fPIC__shared__Wl__Bsymbolic__z_defs" >&6; } -if test $ac_cv_cflags__fPIC__shared__Wl__Bsymbolic__z_defs = yes; then : - LDDLLFLAGS="$LDDLLFLAGS,-z,defs" -fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -fPIC -shared -Wl,-Bsymbolic,-init,__wine_spec_init,-fini,__wine_spec_fini" >&5 -$as_echo_n "checking whether the compiler supports -fPIC -shared -Wl,-Bsymbolic,-init,__wine_spec_init,-fini,__wine_spec_fini... " >&6; } -if ${ac_cv_cflags__fPIC__shared__Wl__Bsymbolic__init___wine_spec_init__fini___wine_spec_fini+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_wine_try_cflags_saved=$CFLAGS -CFLAGS="$CFLAGS -fPIC -shared -Wl,-Bsymbolic,-init,__wine_spec_init,-fini,__wine_spec_fini" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int main(int argc, char **argv) { return 0; } -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_cflags__fPIC__shared__Wl__Bsymbolic__init___wine_spec_init__fini___wine_spec_fini=yes -else - ac_cv_cflags__fPIC__shared__Wl__Bsymbolic__init___wine_spec_init__fini___wine_spec_fini=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -CFLAGS=$ac_wine_try_cflags_saved -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__fPIC__shared__Wl__Bsymbolic__init___wine_spec_init__fini___wine_spec_fini" >&5 -$as_echo "$ac_cv_cflags__fPIC__shared__Wl__Bsymbolic__init___wine_spec_init__fini___wine_spec_fini" >&6; } -if test $ac_cv_cflags__fPIC__shared__Wl__Bsymbolic__init___wine_spec_init__fini___wine_spec_fini = yes; then : - LDDLLFLAGS="$LDDLLFLAGS,-init,__wine_spec_init,-fini,__wine_spec_fini" -fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -fPIC -Wl,--export-dynamic" >&5 $as_echo_n "checking whether the compiler supports -fPIC -Wl,--export-dynamic... " >&6; } if ${ac_cv_cflags__fPIC__Wl___export_dynamic+:} false; then : @@ -7144,7 +7085,6 @@ $as_echo "$ac_cv_c_dll_gnuelf" >&6; } if test "$ac_cv_c_dll_gnuelf" = "yes" then LDSHARED="\$(CC) -shared" - LDDLLFLAGS="-shared -Wl,-Bsymbolic" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -fPIC -shared -Wl,-soname,confest.so.1" >&5 $as_echo_n "checking whether the compiler supports -fPIC -shared -Wl,-soname,confest.so.1... " >&6; } if ${ac_cv_cflags__fPIC__shared__Wl__soname_confest_so_1+:} false; then : @@ -7197,58 +7137,6 @@ if test $ac_cv_cflags__fPIC__shared__Wl__h_confest_so_1 = yes; then : fi fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -fPIC -shared -Wl,-Bsymbolic,-z,defs" >&5 -$as_echo_n "checking whether the compiler supports -fPIC -shared -Wl,-Bsymbolic,-z,defs... " >&6; } -if ${ac_cv_cflags__fPIC__shared__Wl__Bsymbolic__z_defs+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_wine_try_cflags_saved=$CFLAGS -CFLAGS="$CFLAGS -fPIC -shared -Wl,-Bsymbolic,-z,defs" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int main(int argc, char **argv) { return 0; } -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_cflags__fPIC__shared__Wl__Bsymbolic__z_defs=yes -else - ac_cv_cflags__fPIC__shared__Wl__Bsymbolic__z_defs=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -CFLAGS=$ac_wine_try_cflags_saved -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__fPIC__shared__Wl__Bsymbolic__z_defs" >&5 -$as_echo "$ac_cv_cflags__fPIC__shared__Wl__Bsymbolic__z_defs" >&6; } -if test $ac_cv_cflags__fPIC__shared__Wl__Bsymbolic__z_defs = yes; then : - LDDLLFLAGS="$LDDLLFLAGS,-z,defs" -fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -fPIC -shared -Wl,-Bsymbolic,-init,__wine_spec_init,-fini,__wine_spec_fini" >&5 -$as_echo_n "checking whether the compiler supports -fPIC -shared -Wl,-Bsymbolic,-init,__wine_spec_init,-fini,__wine_spec_fini... " >&6; } -if ${ac_cv_cflags__fPIC__shared__Wl__Bsymbolic__init___wine_spec_init__fini___wine_spec_fini+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_wine_try_cflags_saved=$CFLAGS -CFLAGS="$CFLAGS -fPIC -shared -Wl,-Bsymbolic,-init,__wine_spec_init,-fini,__wine_spec_fini" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int main(int argc, char **argv) { return 0; } -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_cflags__fPIC__shared__Wl__Bsymbolic__init___wine_spec_init__fini___wine_spec_fini=yes -else - ac_cv_cflags__fPIC__shared__Wl__Bsymbolic__init___wine_spec_init__fini___wine_spec_fini=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -CFLAGS=$ac_wine_try_cflags_saved -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__fPIC__shared__Wl__Bsymbolic__init___wine_spec_init__fini___wine_spec_fini" >&5 -$as_echo "$ac_cv_cflags__fPIC__shared__Wl__Bsymbolic__init___wine_spec_init__fini___wine_spec_fini" >&6; } -if test $ac_cv_cflags__fPIC__shared__Wl__Bsymbolic__init___wine_spec_init__fini___wine_spec_fini = yes; then : - LDDLLFLAGS="$LDDLLFLAGS,-init,__wine_spec_init,-fini,__wine_spec_fini" -fi - echo '{ global: *; };' >conftest.map { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -fPIC -shared -Wl,--version-script=conftest.map" >&5 $as_echo_n "checking whether the compiler supports -fPIC -shared -Wl,--version-script=conftest.map... " >&6; } @@ -7493,7 +7381,6 @@ $as_echo "$ac_cv_c_dll_unixware" >&6; } if test "$ac_cv_c_dll_unixware" = "yes" then LDSHARED="\$(CC) -Wl,-G,-h,libwine.so.\$(SOVERSION)" - LDDLLFLAGS="-Wl,-G,-B,symbolic" fi fi LIBWINE_RULES=" diff --git a/configure.ac b/configure.ac index 0f84770a9b3..d8033cf41a1 100644 --- a/configure.ac +++ b/configure.ac @@ -677,7 +677,6 @@ dnl **** Check for working dll **** AC_SUBST(DLLEXT,"") AC_SUBST(DLLFLAGS,"-D_REENTRANT") -AC_SUBST(LDDLLFLAGS,"") AC_SUBST(IMPLIBEXT,"def") AC_SUBST(LDRPATH_INSTALL,"") AC_SUBST(LDRPATH_LOCAL,"") @@ -738,7 +737,6 @@ clean:: DLLEXT=".so" LIBEXT="dylib" DLLFLAGS="$DLLFLAGS -fPIC" - LDDLLFLAGS="-bundle -multiply_defined suppress" LIBWINE_LDFLAGS="-multiply_defined suppress" LDRPATH_INSTALL="-Wl,-rpath,@loader_path/\`\$(RELPATH) \$(bindir) \$(libdir)\`" LDRPATH_LOCAL="-Wl,-rpath,@loader_path/\$(top_builddir)/libs/wine" @@ -803,11 +801,6 @@ clean:: AC_CHECK_FUNCS(IOHIDManagerCreate) LIBS="$ac_save_LIBS" fi - case $host_cpu in - *powerpc*) - LDDLLFLAGS="$LDDLLFLAGS -read_only_relocs warning" dnl FIXME - ;; - esac if test "$ac_cv_header_QuickTime_ImageCompression_h" = "yes" then AC_SUBST(QUICKTIMELIB,"-framework QuickTime -framework ApplicationServices -framework CoreVideo") @@ -877,11 +870,6 @@ clean:: linux-android*) DLLFLAGS="$DLLFLAGS -fPIC" DLLEXT=".so" - LDDLLFLAGS="-shared -Wl,-Bsymbolic" - WINE_TRY_CFLAGS([-fPIC -shared -Wl,-Bsymbolic,-z,defs], - [LDDLLFLAGS="$LDDLLFLAGS,-z,defs"]) - WINE_TRY_CFLAGS([-fPIC -shared -Wl,-Bsymbolic,-init,__wine_spec_init,-fini,__wine_spec_fini], - [LDDLLFLAGS="$LDDLLFLAGS,-init,__wine_spec_init,-fini,__wine_spec_fini"]) WINE_TRY_CFLAGS([-fPIC -Wl,--export-dynamic], [AC_SUBST(LDEXECFLAGS,["-Wl,--export-dynamic"])]) WINE_TRY_CFLAGS([-fPIC -Wl,--rpath,\$ORIGIN/../lib], @@ -927,17 +915,11 @@ clean:: if test "$ac_cv_c_dll_gnuelf" = "yes" then LDSHARED="\$(CC) -shared" - LDDLLFLAGS="-shared -Wl,-Bsymbolic" WINE_TRY_CFLAGS([-fPIC -shared -Wl,-soname,confest.so.1], [LDSHARED="\$(CC) -shared -Wl,-soname,libwine.so.\$(SOVERSION)"], [WINE_TRY_CFLAGS([-fPIC -shared -Wl,-h,confest.so.1], [LDSHARED="\$(CC) -shared -Wl,-h,libwine.so.\$(SOVERSION)"])]) - WINE_TRY_CFLAGS([-fPIC -shared -Wl,-Bsymbolic,-z,defs], [LDDLLFLAGS="$LDDLLFLAGS,-z,defs"]) - - WINE_TRY_CFLAGS([-fPIC -shared -Wl,-Bsymbolic,-init,__wine_spec_init,-fini,__wine_spec_fini], - [LDDLLFLAGS="$LDDLLFLAGS,-init,__wine_spec_init,-fini,__wine_spec_fini"]) - echo '{ global: *; };' >conftest.map WINE_TRY_CFLAGS([-fPIC -shared -Wl,--version-script=conftest.map], [LDSHARED="$LDSHARED -Wl,--version-script=\$(srcdir)/wine.map"]) @@ -979,7 +961,6 @@ clean:: if test "$ac_cv_c_dll_unixware" = "yes" then LDSHARED="\$(CC) -Wl,-G,-h,libwine.so.\$(SOVERSION)" - LDDLLFLAGS="-Wl,-G,-B,symbolic" fi fi AC_SUBST(LIBWINE_RULES,[" diff --git a/tools/winegcc/Makefile.in b/tools/winegcc/Makefile.in index 85e8002c72a..37f28fbd4d7 100644 --- a/tools/winegcc/Makefile.in +++ b/tools/winegcc/Makefile.in @@ -3,7 +3,6 @@ DEFS = \ -DDLLDIR="\"$(dlldir)\"" \ -DLIBDIR="\"$(libdir)\"" \ -DDLLFLAGS="\"@DLLFLAGS@\"" \ - -DLDDLLFLAGS="\"@LDDLLFLAGS@\"" \ -DCC="\"$(CC)\"" \ -DCPP="\"@CPPBIN@\"" \ -DCXX="\"@CXX@\"" \ diff --git a/tools/winegcc/utils.c b/tools/winegcc/utils.c index 75fb20bc5ff..a124ef2d342 100644 --- a/tools/winegcc/utils.c +++ b/tools/winegcc/utils.c @@ -297,7 +297,7 @@ file_type get_lib_type(enum target_platform platform, strarray* path, const char return file_na; } -void spawn(const strarray* prefix, const strarray* args, int ignore_errors) +int spawn(const strarray* prefix, const strarray* args, int ignore_errors) { unsigned int i; int status; @@ -343,4 +343,5 @@ void spawn(const strarray* prefix, const strarray* args, int ignore_errors) free(prog); strarray_free(arr); + return status; } diff --git a/tools/winegcc/utils.h b/tools/winegcc/utils.h index 7d20c626390..789b4ea973f 100644 --- a/tools/winegcc/utils.h +++ b/tools/winegcc/utils.h @@ -78,6 +78,6 @@ void create_file(const char* name, int mode, const char* fmt, ...); file_type get_file_type(const char* filename); file_type get_lib_type(enum target_platform platform, strarray* path, const char *library, const char *suffix, char** file); -void spawn(const strarray* prefix, const strarray* arr, int ignore_errors); +int spawn(const strarray* prefix, const strarray* arr, int ignore_errors); extern int verbose; diff --git a/tools/winegcc/winegcc.c b/tools/winegcc/winegcc.c index 89ea31001aa..7328a04bea0 100644 --- a/tools/winegcc/winegcc.c +++ b/tools/winegcc/winegcc.c @@ -330,6 +330,72 @@ static const strarray* get_translator(struct options *opts) return ret; } +static int try_link( const strarray *prefix, const strarray *link_tool, const char *cflags ) +{ + const char *in = get_temp_file( "try_link", ".c" ); + const char *out = get_temp_file( "try_link", ".out" ); + strarray *link = strarray_dup( link_tool ); + int ret; + + create_file( in, 0644, "int main(void){return 1;}" ); + + strarray_add( link, "-o" ); + strarray_add( link, out ); + strarray_addall( link, strarray_fromstring( cflags, " " ) ); + strarray_add( link, in ); + + ret = spawn( prefix, link, 1 ); + strarray_free( link ); + return ret; +} + +static const strarray* get_lddllflags( const struct options *opts, const strarray *link_tool ) +{ + strarray *flags = strarray_alloc(); + switch (opts->target_platform) + { + case PLATFORM_APPLE: + strarray_add( flags, "-bundle" ); + strarray_add( flags, "-multiply_defined" ); + strarray_add( flags, "suppress" ); + if (opts->target_cpu == CPU_POWERPC) + { + strarray_add( flags, "-read_only_relocs" ); + strarray_add( flags, "warning" ); + } + break; + + case PLATFORM_SOLARIS: + strarray_add( flags, "-Wl,-G,-B,symbolic" ); + break; + + case PLATFORM_UNSPECIFIED: + strarray_add( flags, "-shared" ); + strarray_add( flags, "-Wl,-Bsymbolic" ); + + /* Try all options first - this is likely to succeed on modern compilers */ + if (!try_link( opts->prefix, link_tool, "-fPIC -shared -Wl,-Bsymbolic " + "-Wl,-z,defs -Wl,-init,__wine_spec_init,-fini,_wine_spec_fini" )) + { + strarray_add( flags, "-Wl,-z,defs" ); + strarray_add( flags, "-Wl,-init,__wine_spec_init,-fini,__wine_spec_fini" ); + } + else /* otherwise figure out which ones are allowed */ + { + if (!try_link( opts->prefix, link_tool, "-fPIC -shared -Wl,-Bsymbolic -Wl,-z,defs" )) + strarray_add( flags, "-Wl,-z,defs" ); + if (!try_link( opts->prefix, link_tool, "-fPIC -shared -Wl,-Bsymbolic " + "-Wl,-init,__wine_spec_init,-fini,_wine_spec_fini" )) + strarray_add( flags, "-Wl,-init,__wine_spec_init,-fini,__wine_spec_fini" ); + } + break; + + default: + assert(0); + } + return flags; +} + /* check that file is a library for the correct platform */ static int check_platform( struct options *opts, const char *file ) { @@ -1008,7 +1074,7 @@ static void build(struct options* opts) /* link everything together now */ strarray_addall(link_args, get_translator(opts)); - strarray_addall(link_args, strarray_fromstring(LDDLLFLAGS, " ")); + strarray_addall(link_args, get_lddllflags(opts, link_args)); strarray_add(link_args, "-o"); strarray_add(link_args, strmake("%s.so", output_file));