From c55578f3a54c63084657e7d79c043b22b10df989 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Mon, 19 Jun 2023 16:35:02 +0200 Subject: [PATCH] loader: Always build the main loader as PIE if we have a preloader. --- configure | 93 +++++++++++++++++++++--------------------------------------- configure.ac | 31 ++++++++++---------- 2 files changed, 48 insertions(+), 76 deletions(-) diff --git a/configure b/configure index 98481fd6a49..e2f60383fa0 100755 --- a/configure +++ b/configure @@ -10245,104 +10245,77 @@ if test "x$ac_cv_cflags__Wl___export_dynamic" = xyes then : WINELOADER_LDFLAGS="-Wl,--export-dynamic" fi - WINEPRELOADER_LDFLAGS="-static -nostartfiles -nodefaultlibs -Wl,-Ttext=0x7d400000" - case $host_cpu in - *i[3456789]86* | arm*) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -Wl,-Ttext-segment=0x7bc00000" >&5 -printf %s "checking whether the compiler supports -Wl,-Ttext-segment=0x7bc00000... " >&6; } -if test ${ac_cv_cflags__Wl__Ttext_segment_0x7bc00000+y} + case $host_os in + linux*) + as_fn_append WINELOADER_LDFLAGS " -pie" + WINEPRELOADER_LDFLAGS="-static -nostartfiles -nodefaultlibs -Wl,-Ttext=0x7d400000" + ;; + *) + case $HOST_ARCH in + i386|arm) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -Wl,-Ttext-segment=0x60000000" >&5 +printf %s "checking whether the compiler supports -Wl,-Ttext-segment=0x60000000... " >&6; } +if test ${ac_cv_cflags__Wl__Ttext_segment_0x60000000+y} then : printf %s "(cached) " >&6 else $as_nop ac_wine_try_cflags_saved=$CFLAGS -CFLAGS="$CFLAGS -Wl,-Ttext-segment=0x7bc00000" +CFLAGS="$CFLAGS -Wl,-Ttext-segment=0x60000000" 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__Wl__Ttext_segment_0x7bc00000=yes + ac_cv_cflags__Wl__Ttext_segment_0x60000000=yes else $as_nop - ac_cv_cflags__Wl__Ttext_segment_0x7bc00000=no + ac_cv_cflags__Wl__Ttext_segment_0x60000000=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$ac_wine_try_cflags_saved fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__Wl__Ttext_segment_0x7bc00000" >&5 -printf "%s\n" "$ac_cv_cflags__Wl__Ttext_segment_0x7bc00000" >&6; } -if test "x$ac_cv_cflags__Wl__Ttext_segment_0x7bc00000" = xyes +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__Wl__Ttext_segment_0x60000000" >&5 +printf "%s\n" "$ac_cv_cflags__Wl__Ttext_segment_0x60000000" >&6; } +if test "x$ac_cv_cflags__Wl__Ttext_segment_0x60000000" = xyes then : - case $host_os in - freebsd* | kfreebsd*-gnu) WINELOADER_LDFLAGS="$WINELOADER_LDFLAGS -Wl,-Ttext-segment=0x60000000" ;; - *) WINELOADER_LDFLAGS="$WINELOADER_LDFLAGS -Wl,-Ttext-segment=0x7d000000" ;; - esac + as_fn_append WINELOADER_LDFLAGS " -Wl,-Ttext-segment=0x60000000" else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -Wl,--section-start,.interp=0x7d000400" >&5 -printf %s "checking whether the compiler supports -Wl,--section-start,.interp=0x7d000400... " >&6; } -if test ${ac_cv_cflags__Wl___section_start__interp_0x7d000400+y} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -Wl,--section-start,.interp=0x60000400" >&5 +printf %s "checking whether the compiler supports -Wl,--section-start,.interp=0x60000400... " >&6; } +if test ${ac_cv_cflags__Wl___section_start__interp_0x60000400+y} then : printf %s "(cached) " >&6 else $as_nop ac_wine_try_cflags_saved=$CFLAGS -CFLAGS="$CFLAGS -Wl,--section-start,.interp=0x7d000400" +CFLAGS="$CFLAGS -Wl,--section-start,.interp=0x60000400" 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__Wl___section_start__interp_0x7d000400=yes + ac_cv_cflags__Wl___section_start__interp_0x60000400=yes else $as_nop - ac_cv_cflags__Wl___section_start__interp_0x7d000400=no + ac_cv_cflags__Wl___section_start__interp_0x60000400=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$ac_wine_try_cflags_saved fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__Wl___section_start__interp_0x7d000400" >&5 -printf "%s\n" "$ac_cv_cflags__Wl___section_start__interp_0x7d000400" >&6; } -if test "x$ac_cv_cflags__Wl___section_start__interp_0x7d000400" = xyes +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__Wl___section_start__interp_0x60000400" >&5 +printf "%s\n" "$ac_cv_cflags__Wl___section_start__interp_0x60000400" >&6; } +if test "x$ac_cv_cflags__Wl___section_start__interp_0x60000400" = xyes then : - case $host_os in - freebsd* | kfreebsd*-gnu) WINELOADER_LDFLAGS="$WINELOADER_LDFLAGS -Wl,--section-start,.interp=0x60000400" ;; - *) WINELOADER_LDFLAGS="$WINELOADER_LDFLAGS -Wl,--section-start,.interp=0x7d000400" ;; - esac + as_fn_append WINELOADER_LDFLAGS " -Wl,--section-start,.interp=0x60000400" fi fi - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -Wl,-z,max-page-size=0x1000" >&5 -printf %s "checking whether the compiler supports -Wl,-z,max-page-size=0x1000... " >&6; } -if test ${ac_cv_cflags__Wl__z_max_page_size_0x1000+y} -then : - printf %s "(cached) " >&6 -else $as_nop - ac_wine_try_cflags_saved=$CFLAGS -CFLAGS="$CFLAGS -Wl,-z,max-page-size=0x1000" -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__Wl__z_max_page_size_0x1000=yes -else $as_nop - ac_cv_cflags__Wl__z_max_page_size_0x1000=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext -CFLAGS=$ac_wine_try_cflags_saved -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__Wl__z_max_page_size_0x1000" >&5 -printf "%s\n" "$ac_cv_cflags__Wl__z_max_page_size_0x1000" >&6; } -if test "x$ac_cv_cflags__Wl__z_max_page_size_0x1000" = xyes -then : - WINELOADER_LDFLAGS="$WINELOADER_LDFLAGS -Wl,-z,max-page-size=0x1000" -fi - ;; - *) - WINELOADER_LDFLAGS="$WINELOADER_LDFLAGS -pie" + ;; + *) + as_fn_append WINELOADER_LDFLAGS " -pie" + ;; + esac ;; esac ;; diff --git a/configure.ac b/configure.ac index 9c98646a344..562d50209a6 100644 --- a/configure.ac +++ b/configure.ac @@ -769,25 +769,24 @@ case $host_os in WINE_TRY_CFLAGS([-Wl,-z,defs],[UNIXLDFLAGS="$UNIXLDFLAGS -Wl,-z,defs"]) WINE_TRY_CFLAGS([-Wl,--export-dynamic],[WINELOADER_LDFLAGS="-Wl,--export-dynamic"]) - WINEPRELOADER_LDFLAGS="-static -nostartfiles -nodefaultlibs -Wl,-Ttext=0x7d400000" - case $host_cpu in - *i[[3456789]]86* | arm*) - WINE_TRY_CFLAGS([-Wl,-Ttext-segment=0x7bc00000], - [case $host_os in - freebsd* | kfreebsd*-gnu) WINELOADER_LDFLAGS="$WINELOADER_LDFLAGS -Wl,-Ttext-segment=0x60000000" ;; - *) WINELOADER_LDFLAGS="$WINELOADER_LDFLAGS -Wl,-Ttext-segment=0x7d000000" ;; - esac], - [WINE_TRY_CFLAGS([-Wl,--section-start,.interp=0x7d000400], - [case $host_os in - freebsd* | kfreebsd*-gnu) WINELOADER_LDFLAGS="$WINELOADER_LDFLAGS -Wl,--section-start,.interp=0x60000400" ;; - *) WINELOADER_LDFLAGS="$WINELOADER_LDFLAGS -Wl,--section-start,.interp=0x7d000400" ;; - esac])]) - WINE_TRY_CFLAGS([-Wl,-z,max-page-size=0x1000], - [WINELOADER_LDFLAGS="$WINELOADER_LDFLAGS -Wl,-z,max-page-size=0x1000"]) + case $host_os in + linux*) + AS_VAR_APPEND([WINELOADER_LDFLAGS],[" -pie"]) + WINEPRELOADER_LDFLAGS="-static -nostartfiles -nodefaultlibs -Wl,-Ttext=0x7d400000" ;; *) - WINELOADER_LDFLAGS="$WINELOADER_LDFLAGS -pie" + case $HOST_ARCH in + i386|arm) + WINE_TRY_CFLAGS([-Wl,-Ttext-segment=0x60000000], + [AS_VAR_APPEND([WINELOADER_LDFLAGS],[" -Wl,-Ttext-segment=0x60000000"])], + [WINE_TRY_CFLAGS([-Wl,--section-start,.interp=0x60000400], + [AS_VAR_APPEND([WINELOADER_LDFLAGS],[" -Wl,--section-start,.interp=0x60000400"])])]) + ;; + *) + AS_VAR_APPEND([WINELOADER_LDFLAGS],[" -pie"]) + ;; + esac ;; esac ;; -- 2.11.4.GIT