diff --git a/ChangeLog b/ChangeLog
index ce67af9eab56b9b9fce8a57fe089111ebf37a80e..30ae48e8a38e1ae4f1c72bff097120be002c59f8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2020-03-31  Niels Möller  <nisse@lysator.liu.se>
+
+	* config.make.in (abs_top_builddir, TEST_SHLIB_DIR): New variables.
+
+	* run-tests: Check TEST_SHLIB_DIR, and set up LD_LIBRARY_PATH and
+	related member variables.
+
+	* testsuite/Makefile.in (check): Pass only TEST_SHLIB_DIR
+	to the run-tests script, and leave setting of LD_LIBRARY_PATH and
+	related variables to that script.
+	* examples/Makefile.in (check): Likewise.
+
 2020-03-26  Niels Möller  <nisse@lysator.liu.se>
 
 	* configure.ac: Bump package version to 3.6.
diff --git a/config.make.in b/config.make.in
index 649b769515a045c0ee94655a77ac5f1e8b185986..3f8170761ed8fd105ab4914a313a1885e972afbe 100644
--- a/config.make.in
+++ b/config.make.in
@@ -64,6 +64,9 @@ bindir =	@bindir@
 libdir =	@libdir@
 includedir =	@includedir@
 infodir =	@infodir@
+abs_top_builddir = @abs_top_builddir@
+
+TEST_SHLIB_DIR = "${abs_top_builddir}/.lib"
 
 # PRE_CPPFLAGS and PRE_LDFLAGS lets each Makefile.in prepend its own
 # flags before CPPFLAGS and LDFLAGS. While EXTRA_CFLAGS are added at the end.
diff --git a/examples/Makefile.in b/examples/Makefile.in
index db8e91cceeea57a74911915511b334e1d56ab5b8..eb6a81790403f5faa9be84acb6004d0737722b70 100644
--- a/examples/Makefile.in
+++ b/examples/Makefile.in
@@ -113,9 +113,8 @@ hogweed-benchmark$(EXEEXT): $(HOGWEED_BENCH_OBJS)
 $(TARGETS) : io.$(OBJEXT) ../libnettle.stamp
 $(HOGWEED_TARGETS): ../libhogweed.stamp
 
-# The PATH update is for windows dlls, DYLD_LIBRARY_PATH is for OSX.
 check: $(TS_ALL)
-	LD_LIBRARY_PATH=../.lib PATH="../.lib:$$PATH" DYLD_LIBRARY_PATH=../.lib \
+	TEST_SHLIB_DIR="$(TEST_SHLIB_DIR)" \
 	  srcdir="$(srcdir)" EMULATOR="$(EMULATOR)" EXEEXT="$(EXEEXT)" \
           "$(top_srcdir)"/run-tests $(TS_ALL)
 
diff --git a/run-tests b/run-tests
index 3d5655cf382fe3b3b4465f3a2db683e090eb321b..5186d0c81a7b0f43f5436d9f8cf711994ecae120 100755
--- a/run-tests
+++ b/run-tests
@@ -28,6 +28,18 @@ fi
 
 export srcdir
 
+if [ -n "$TEST_SHLIB_DIR" ] ; then
+  # Prepend to LD_LIBRARY_PATH, if it is alredy set.
+  LD_LIBRARY_PATH="${TEST_SHLIB_DIR}${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
+  # For MACOS
+  DYLD_LIBRARY_PATH="$TEST_SHLIB_DIR"
+  # For Windows
+  PATH="${TEST_SHLIB_DIR}:${PATH}"
+  export LD_LIBRARY_PATH
+  export DYLD_LIBRARY_PATH
+  export PATH
+fi
+
 # When used in make rules, we sometimes get the filenames VPATH
 # expanded, but usually not.
 find_program () {
diff --git a/testsuite/Makefile.in b/testsuite/Makefile.in
index 70a9279347843aa11640226df3fef87f4dac15fc..89b52efad9df225ae9970dcd3d42d0b27dfb6b5e 100644
--- a/testsuite/Makefile.in
+++ b/testsuite/Makefile.in
@@ -139,9 +139,8 @@ $(TARGETS) $(EXTRA_TARGETS): testutils.$(OBJEXT) ../nettle-internal.$(OBJEXT) \
 # data.
 VALGRIND = valgrind --error-exitcode=1 --leak-check=full --show-reachable=yes @IF_ASM@ --partial-loads-ok=yes
 
-# The PATH update is for windows dlls, DYLD_LIBRARY_PATH is for OSX.
 check: $(TS_ALL)
-	LD_LIBRARY_PATH=../.lib PATH="../.lib:$$PATH" DYLD_LIBRARY_PATH=../.lib \
+	TEST_SHLIB_DIR="$(TEST_SHLIB_DIR)" \
 	  srcdir="$(srcdir)" \
 	  EMULATOR="$(EMULATOR)" NM="$(NM)" EXEEXT="$(EXEEXT)" \
           $(top_srcdir)/run-tests $(TS_ALL)