diff --git a/ChangeLog b/ChangeLog
index 5cc379018947ea013feba536d1282f7a0fd7ce5a..996619300a412f06170697d83dde49450afae03f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2023-10-06  Niels Möller  <nisse@lysator.liu.se>
 
+	* aclocal.m4 (NETTLE_PROG_VALGRIND): New macro.
+	* configure.ac: Use it.
+	* testsuite/Makefile.in (TS_SH): Include side-channel tests only
+	if we have a working valgrind.
+
 	* misc/c89: New wrapper script to force compiling in c89 mode.
 
 2023-10-04  Niels Möller  <nisse@lysator.liu.se>
diff --git a/aclocal.m4 b/aclocal.m4
index 0d27e18305c3c55b45bbe7c592adad1708575d52..629db8a7d20b9ea91b2fd333f4ab8d31da0dd46f 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -546,3 +546,21 @@ AC_DEFUN([GMP_ASM_POWERPC_R_REGISTERS],
 [AC_MSG_ERROR([neither "mtctr 6" nor "mtctr r6" works])])])])
 ASM_PPC_WANT_R_REGISTERS="$gmp_cv_asm_powerpc_r_registers"
 ])
+
+# Check if valgrind supports the platform we are compiling for.
+AC_DEFUN([NETTLE_PROG_VALGRIND],
+[AC_CACHE_CHECK([if valgrind is working],
+  nettle_cv_prog_valgrind,
+  [AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])], [
+    if valgrind -q ./conftest$EXEEXT 2>&AS_MESSAGE_LOG_FD; then
+      nettle_cv_prog_valgrind=yes
+    else
+      nettle_cv_prog_valgrind=no
+    fi], [nettle_cv_prog_valgrind=no])])
+  if test "$nettle_cv_prog_valgrind" = yes ; then
+    IF_VALGRIND=''
+  else
+    IF_VALGRIND='#'
+  fi
+  AC_SUBST(IF_VALGRIND)
+])
diff --git a/configure.ac b/configure.ac
index 177b40f32745e4342278454d2cd97469a4511457..867767a6a16d6e67fa1d5c070cb048e67c0bae00 100644
--- a/configure.ac
+++ b/configure.ac
@@ -171,6 +171,9 @@ AC_PROG_LN_S
 GMP_PROG_CC_FOR_BUILD
 GMP_PROG_EXEEXT_FOR_BUILD
 
+# Check if valgrind is working; expected to fail in cross builds.
+NETTLE_PROG_VALGRIND
+
 LSH_DEPENDENCY_TRACKING
 
 if test "x$enable_gcov" = "xyes"; then
diff --git a/testsuite/Makefile.in b/testsuite/Makefile.in
index 475ec97dc5784aa2a7df169a9a481d2586310e54..0cb896ff7bf626e6b50454a655013472014a95a3 100644
--- a/testsuite/Makefile.in
+++ b/testsuite/Makefile.in
@@ -68,7 +68,7 @@ TS_CXX = @IF_CXX@ $(CXX_SOURCES:.cxx=$(EXEEXT))
 TARGETS = $(TS_C) $(TS_CXX)
 TS_SC = sc-cnd-memcpy-test sc-gcm-test sc-memeql-test \
 	@IF_HOGWEED@ sc-pkcs1-sec-decrypt-test sc-rsa-sec-decrypt-test
-TS_SH = $(TS_SC) symbols-test
+TS_SH = symbols-test @IF_VALGRIND@ $(TS_SC)
 TS_ALL = $(TARGETS) $(TS_SH) @IF_DLOPEN_TEST@ dlopen-test$(EXEEXT)
 
 TS_FAT = $(patsubst %, %$(EXEEXT), aes-test cbc-test \