aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2024-12-16 19:20:54 +0800
committerH.J. Lu <hjl.tools@gmail.com>2024-12-22 12:55:50 +0800
commitd9d30f6cb582fbd3932aa4731061c6335ffc5a70 (patch)
tree74b702da46a9377a9adf61f1f4dce3182f5025e2
parentf5fb9fa011f242bfd8c291fe876532ebd252397e (diff)
downloadglibc-d9d30f6cb582fbd3932aa4731061c6335ffc5a70.tar.xz
glibc-d9d30f6cb582fbd3932aa4731061c6335ffc5a70.zip
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 <hjl.tools@gmail.com> Reviewed-by: Sam James <sam@gentoo.org>
-rwxr-xr-xconfigure47
-rw-r--r--configure.ac22
-rw-r--r--elf/Makefile4
-rw-r--r--nptl/Makefile9
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 <<EOF
+$conftest_code
+EOF
+
+saved_CC="$CC"
+CC="$TEST_CC"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for trampolines in testing" >&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