[PATCH 09/39] Enable execstack tests only if compiler supports trampoline

H.J. Lu hjl.tools@gmail.com
Sun Dec 22 00:04:32 GMT 2024


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>
---
 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 73eaf0e4e7..1eb2d1e7e9 100755
--- a/configure
+++ b/configure
@@ -7775,6 +7775,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 ecb51e4384..9f72a2a0ae 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1528,6 +1528,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
-- 
2.47.1



More information about the Libc-alpha mailing list