diff options
-rw-r--r-- | elf/Makefile | 7 | ||||
-rw-r--r-- | elf/tst-valgrind-smoke.sh | 46 | ||||
-rw-r--r-- | elf/valgrind-test.c | 49 |
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; +} |