From d9d30f6cb582fbd3932aa4731061c6335ffc5a70 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Mon, 16 Dec 2024 19:20:54 +0800 Subject: [PATCH] Enable execstack tests only if compiler supports trampoline Since trampoline is required to test execstack, enable execstack tests only if compiler supports trampoline. Signed-off-by: H.J. Lu Reviewed-by: Sam James --- configure | 47 +++++++++++++++++++++++++++++++++++++++++++++++ configure.ac | 22 ++++++++++++++++++++++ elf/Makefile | 4 ++++ nptl/Makefile | 9 +++++++-- 4 files changed, 80 insertions(+), 2 deletions(-) diff --git a/configure b/configure index b899d39717..aaad07e952 100755 --- a/configure +++ b/configure @@ -7774,6 +7774,53 @@ config_vars="$config_vars cc-option-wimplicit-fallthrough = $libc_cv_cc_wimplicit_fallthrough" +conftest_code=" +void bar (void (*callback) (void)); +int foo (void) +{ + int var = 0; + void callback (void) { var = 1; } + bar (callback); + return var; +} +" + + +cat > conftest.c <&5 +printf %s "checking support for trampolines in testing... " >&6; } +if test ${libc_cv_test_cc_trampolines+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -c -Werror conftest.c -o conftest 1>&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 + (eval $ac_try) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; } + then + libc_cv_test_cc_trampolines=yes + else + libc_cv_test_cc_trampolines=no + + fi ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_test_cc_trampolines" >&5 +printf "%s\n" "$libc_cv_test_cc_trampolines" >&6; } + +CC="$saved_CC" + +rm -f conftest* +config_vars="$config_vars +have-test-cc-trampoline = $libc_cv_test_cc_trampolines" + saved_CC="$CC" diff --git a/configure.ac b/configure.ac index 6eaf83b8dc..d4c1c7c916 100644 --- a/configure.ac +++ b/configure.ac @@ -1527,6 +1527,28 @@ LIBC_CONFIG_VAR([cc-option-wimplicit-fallthrough], [$libc_cv_cc_wimplicit_fallthrough]) AC_SUBST(libc_cv_test_cc_wimplicit_fallthrough) +conftest_code=" +void bar (void (*callback) (void)); +int foo (void) +{ + int var = 0; + void callback (void) { var = 1; } + bar (callback); + return var; +} +" + +dnl Check if TEST_CC support trampolines. +LIBC_TRY_TEST_CC_COMMAND([support for trampolines], + [$conftest_code], + [-c -Werror], + libc_cv_test_cc_trampolines, + [libc_cv_test_cc_trampolines=yes], + [libc_cv_test_cc_trampolines=no] +) +LIBC_CONFIG_VAR([have-test-cc-trampoline], + [$libc_cv_test_cc_trampolines]) + dnl Check if TEST_CC supports -finput-charset=ascii. LIBC_TRY_TEST_CC_OPTION([-finput-charset=ascii], [-c -Werror -finput-charset=ascii], diff --git a/elf/Makefile b/elf/Makefile index a5a25a8370..b62836d79c 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -557,12 +557,14 @@ endif selinux-enabled := $(shell cat /selinux/enforce 2> /dev/null) ifneq ($(selinux-enabled),1) +ifeq ($(have-test-cc-trampoline),yes) tests-execstack-yes = \ tst-execstack \ tst-execstack-needed \ tst-execstack-prog \ # tests-execstack-yes endif +endif ifeq ($(have-depaudit),yes) tests += \ tst-audit14 \ @@ -1146,7 +1148,9 @@ tests-pie += vismain CFLAGS-vismain.c += $(PIE-ccflag) endif endif +ifeq ($(have-test-cc-trampoline),yes) modules-execstack-yes = tst-execstack-mod +endif extra-test-objs += $(addsuffix .os,$(strip $(modules-names))) # filtmod1.so, tst-big-note-lib.so, tst-ro-dynamic-mod.so have special diff --git a/nptl/Makefile b/nptl/Makefile index 88077e27bb..bc2e499a7c 100644 --- a/nptl/Makefile +++ b/nptl/Makefile @@ -474,7 +474,7 @@ tests-internal += \ tst-tls3-malloc \ tst-tls5 \ # tests-internal -ifeq ($(have-z-execstack),yes) +ifeq ($(have-z-execstack)$(have-test-cc-trampoline),yesyes) tests += tst-execstack-threads endif endif @@ -483,7 +483,6 @@ modules-names = \ tst-audit-threads-mod1 \ tst-audit-threads-mod2 \ tst-compat-forwarder-mod \ - tst-execstack-threads-mod \ tst-stack4mod \ tst-tls3mod \ tst-tls5mod \ @@ -504,6 +503,12 @@ test-extras += \ tst-cleanupx4aux \ # test-extras +ifneq ($(have-test-clang),yes) +modules-names += \ + tst-execstack-threads-mod \ + # modules-names +endif + # This test exercises compat symbols removed in glibc 2.34. ifdef have-GLIBC_2.33 tests += tst-cleanup4