summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--elf/Makefile7
-rw-r--r--elf/tst-valgrind-smoke.sh46
-rw-r--r--elf/valgrind-test.c49
3 files changed, 102 insertions, 0 deletions
diff --git a/elf/Makefile b/elf/Makefile
index 692a65b061..6cc53c387a 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -450,6 +450,7 @@ tests += \
unload6 \
unload7 \
unload8 \
+ valgrind-test \
# tests
tests-cxx = \
tst-dlopen-nodelete-reloc \
@@ -524,6 +525,12 @@ tests-special += \
endif
endif
endif
+
+tests-special += $(objpfx)tst-valgrind-smoke.out
+$(objpfx)tst-valgrind-smoke.out: tst-valgrind-smoke.sh $(objpfx)ld.so $(objpfx)valgrind-test
+ $(SHELL) $< $(objpfx)ld.so $(rtlddir)/$(rtld-installed-name) '$(test-wrapper-env)' \
+ '$(run-program-env)' '$(rpath-link)' $(objpfx)valgrind-test > $@; $(evaluate-test)
+
tests += $(tests-execstack-$(have-z-execstack))
ifeq ($(run-built-tests),yes)
tests-special += \
diff --git a/elf/tst-valgrind-smoke.sh b/elf/tst-valgrind-smoke.sh
new file mode 100644
index 0000000000..7ce4af6897
--- /dev/null
+++ b/elf/tst-valgrind-smoke.sh
@@ -0,0 +1,46 @@
+#!/bin/sh
+# Valgrind smoke test.
+# Copyright (C) 2022 Free Software Foundation, Inc.
+# This file is part of the GNU C Library.
+
+# The GNU C Library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+
+# The GNU C Library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+
+# You should have received a copy of the GNU Lesser General Public
+# License along with the GNU C Library; if not, see
+# <https://www.gnu.org/licenses/>.
+
+set -e
+
+rtld="$1"
+system_rtld="$2"
+test_wrapper_env="$3"
+run_program_env="$4"
+library_path="$5"
+test_prog="$6"
+
+# Test whether valgrind is available in the test
+# environment. If not, skip the test.
+${test_wrapper_env} ${run_program_env} \
+ /bin/sh -c "command -v valgrind" || exit 77
+
+# Test valgrind works with the system ld.so in the test environment
+/bin/sh -c \
+ "${test_wrapper_env} ${run_program_env} \
+ valgrind -q --error-exitcode=1 \
+ ${system_rtld} /bin/echo ${system_rtld}" || exit 77
+
+# Finally the actual test inside the test environment,
+# using the just build ld.so and new libraries to run
+# the smoke test under valgrind.
+/bin/sh -c \
+ "${test_wrapper_env} ${run_program_env} \
+ valgrind -q --error-exitcode=1 \
+ ${rtld} --library-path ${library_path} ${test_prog} ${rtld}"
diff --git a/elf/valgrind-test.c b/elf/valgrind-test.c
new file mode 100644
index 0000000000..71b8a09b35
--- /dev/null
+++ b/elf/valgrind-test.c
@@ -0,0 +1,49 @@
+/* This is the simple test intended to be called by
+ tst-valgrind-smoke to perform vagrind smoke test.
+ Copyright (C) 2022 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <errno.h>
+#include <libintl.h>
+#include <locale.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <support/support.h>
+
+int
+main (int argc, char **argv)
+{
+ /* Do some non-trivial stuff that has been known to trigger
+ issues under valgrind in the past.
+ Setting up the locale textdomain makes sure to test some
+ string/path comparisons, file search and library loading. */
+ xsetlocale (LC_ALL, "");
+ if (bindtextdomain ("translit", "") == NULL)
+ return errno;
+ if (textdomain ("translit") == NULL)
+ return errno;
+
+ /* Show what we are executing and how... */
+ char *me = realpath (argv[0], NULL);
+ printf ("bin: %s\n", me);
+ printf ("ld.so: %s\n", argv[1]);
+ free (me);
+
+ return 0;
+}