diff --git a/testsuite/driver/testlib.py b/testsuite/driver/testlib.py
index 4177a2a15d18c156043d1cf22cd436ede63f6992..3ee9a8afdf386f87398e4397662550f5adb84068 100644
--- a/testsuite/driver/testlib.py
+++ b/testsuite/driver/testlib.py
@@ -192,6 +192,10 @@ def req_interp( name, opts ):
     if not config.have_interp:
         opts.expect = 'fail'
 
+def req_rts_linker( name, opts ):
+    if not config.have_RTS_linker:
+        opts.expect = 'fail'
+
 def req_th( name, opts ):
     """
     Mark a test as requiring TemplateHaskell. In addition to having interpreter
diff --git a/testsuite/tests/driver/all.T b/testsuite/tests/driver/all.T
index 3df5ca3f6845a7b012549ae8249f952d74913887..11796951f2055f7a1b11508dcf47e3e017275127 100644
--- a/testsuite/tests/driver/all.T
+++ b/testsuite/tests/driver/all.T
@@ -130,8 +130,7 @@ test('dynHelloWorld',
      [''])
 
 test('T5313',
-     [ unless(config.have_RTS_linker, skip),
-       extra_run_opts('"' + config.libdir + '"')],
+     [ req_rts_linker, extra_run_opts('"' + config.libdir + '"')],
      compile_and_run,
      ['-package ghc'])
 
diff --git a/testsuite/tests/driver/linkwhole/all.T b/testsuite/tests/driver/linkwhole/all.T
index e4881bbcc5313e11f27a9482821a89f13dba3fce..37030528b0aea9fef390661237523dd5cc1904bf 100644
--- a/testsuite/tests/driver/linkwhole/all.T
+++ b/testsuite/tests/driver/linkwhole/all.T
@@ -1,6 +1,6 @@
 test('linkwhole',
      [extra_files(['Types.hs','Main.hs','MyCode.hs','Handles.hs']),
-      unless(config.have_RTS_linker, skip),
+      req_rts_linker,
       when(opsys('freebsd'), expect_broken(16035)),
       when(opsys('mingw32'), skip)],
      makefile_test, [])
diff --git a/testsuite/tests/ghc-api/T10052/all.T b/testsuite/tests/ghc-api/T10052/all.T
index 0e0f3bc866da9fb3a66a24a51d5dde329f81c794..a3b70406080b9ca4659169e92c9c96469063686d 100644
--- a/testsuite/tests/ghc-api/T10052/all.T
+++ b/testsuite/tests/ghc-api/T10052/all.T
@@ -1,3 +1,2 @@
-test('T10052', [unless(config.have_RTS_linker, skip),
-	       	req_interp],
+test('T10052', [req_rts_linker, req_interp],
      makefile_test, ['T10052'])
diff --git a/testsuite/tests/ghc-api/all.T b/testsuite/tests/ghc-api/all.T
index 8df85e07dbb0bb844d254abb80ff94029e1a2fd1..fa7f7a93483d97a2d17621e98dac55fe9f574a67 100644
--- a/testsuite/tests/ghc-api/all.T
+++ b/testsuite/tests/ghc-api/all.T
@@ -1,14 +1,14 @@
 test('ghcApi', normal, compile_and_run, ['-package ghc'])
 test('T6145', normal, makefile_test, ['T6145'])
-test('T8639_api', unless (config.have_RTS_linker, skip),
+test('T8639_api', req_rts_linker,
               makefile_test, ['T8639_api'])
-test('T8628', unless(config.have_RTS_linker, skip),
+test('T8628', req_rts_linker,
               makefile_test, ['T8628'])
 test('T9595', extra_run_opts('"' + config.libdir + '"'),
               compile_and_run,
               ['-package ghc'])
 test('T10508_api', [ extra_run_opts('"' + config.libdir + '"'),
-                     unless(config.have_RTS_linker, skip)],
+                     req_rts_linker ],
                    compile_and_run,
                    ['-package ghc'])
 test('T10942', extra_run_opts('"' + config.libdir + '"'),
diff --git a/testsuite/tests/ghc-api/dynCompileExpr/all.T b/testsuite/tests/ghc-api/dynCompileExpr/all.T
index fd47e95a521c22b91c373f7257c44f55df23bdf6..d067e690e247e2489cf002a459ab61a4044a7afd 100644
--- a/testsuite/tests/ghc-api/dynCompileExpr/all.T
+++ b/testsuite/tests/ghc-api/dynCompileExpr/all.T
@@ -1,6 +1,5 @@
 test('dynCompileExpr',
      [ extra_run_opts('"' + config.libdir + '"'),
        when(opsys('mingw32'), expect_broken_for(5987, ['dyn'])),
-       unless(config.have_RTS_linker, skip),
-       omit_ways(prof_ways) ], # cannot run interpreted code with -prof
+       req_rts_linker, omit_ways(prof_ways) ], # cannot run interpreted code with -prof
      compile_and_run, ['-package ghc'])
diff --git a/testsuite/tests/ghci/T16392/all.T b/testsuite/tests/ghci/T16392/all.T
index 7b9bd4bf6b8d3d0ed3a68658c8e79d40a264e8c8..fa16e2daa44f4cf47a470c968a9142304924d095 100644
--- a/testsuite/tests/ghci/T16392/all.T
+++ b/testsuite/tests/ghci/T16392/all.T
@@ -1,4 +1,5 @@
 test('T16392',
      [extra_files(['A.hs']),
-      when(config.have_ext_interp, extra_ways(['ghci-ext']))],
+      extra_ways(['ghci-ext']),
+      req_rts_linker],
      ghci_script, ['T16392.script'])
diff --git a/testsuite/tests/ghci/linking/all.T b/testsuite/tests/ghci/linking/all.T
index a049df3b3421cb465d7c4174e4db862d52dee7a8..c537066f089e5b9c33a1328247e35f57c9153fb6 100644
--- a/testsuite/tests/ghci/linking/all.T
+++ b/testsuite/tests/ghci/linking/all.T
@@ -15,7 +15,7 @@ test('ghcilink003', [unless(doing_ghci, skip)], makefile_test, ['ghcilink003'])
 test('ghcilink004',
      [extra_files(['TestLink.hs', 'f.c']),
       unless(doing_ghci, skip),
-      unless(config.have_RTS_linker, skip)],
+      req_rts_linker],
      makefile_test, ['ghcilink004'])
 
 test('ghcilink005',
diff --git a/testsuite/tests/ghci/linking/dyn/all.T b/testsuite/tests/ghci/linking/dyn/all.T
index 550ae1b0d8a1ede42b702db2b13191a037c91c85..9a54670732363f14e18ef9fd3c7d82ae0e6bcfd1 100644
--- a/testsuite/tests/ghci/linking/dyn/all.T
+++ b/testsuite/tests/ghci/linking/dyn/all.T
@@ -47,6 +47,7 @@ test('big-obj', [extra_files(['big-obj-c.c', 'big-obj.hs']),
 
 test('T3372',
      [unless(doing_ghci, skip),
+      req_rts_linker,
       extra_run_opts('"' + config.libdir + '"'),
       unless(config.have_RTS_linker, skip),
       # Concurrent GHC sessions is fragile on Windows since we must lock the
diff --git a/testsuite/tests/ghci/prog001/prog001.T b/testsuite/tests/ghci/prog001/prog001.T
index 7cd60c0b20b66199c51523a39baa0fa236414657..3f2d1bea36c44f41c3211f64b546208c198affa9 100644
--- a/testsuite/tests/ghci/prog001/prog001.T
+++ b/testsuite/tests/ghci/prog001/prog001.T
@@ -1,5 +1,6 @@
 test('prog001',
      [extra_files(['../shell.hs', 'A.hs', 'B.hs', 'C1.hs', 'D1.hs', 'D2.hs']),
       cmd_prefix('ghciWayFlags=' + config.ghci_way_flags),
-      unless(opsys('mingw32') or (not config.have_ext_interp), extra_ways(['ghci-ext']))],
+      req_rts_linker,
+      unless(opsys('mingw32'), extra_ways(['ghci-ext']))],
      ghci_script, ['prog001.script'])
diff --git a/testsuite/tests/ghci/scripts/all.T b/testsuite/tests/ghci/scripts/all.T
index 0a2b2f1d6114fba61293ab7c7c6160439e9cfd1c..ae0e38cb4e83f9f1db3708d097b774e1e4914e18 100755
--- a/testsuite/tests/ghci/scripts/all.T
+++ b/testsuite/tests/ghci/scripts/all.T
@@ -10,12 +10,12 @@
 test('ghci001', combined_output, ghci_script, ['ghci001.script'])
 test('ghci002', combined_output, ghci_script, ['ghci002.script'])
 test('ghci003', combined_output, ghci_script, ['ghci003.script'])
-test('ghci004', [ combined_output,
-                  unless(opsys('mingw32') or (not config.have_ext_interp),extra_ways(['ghci-ext'])) ],
+test('ghci004', [ combined_output, req_rts_linker,
+                  unless(opsys('mingw32'),extra_ways(['ghci-ext'])) ],
                 ghci_script, ['ghci004.script'])
 test('ghci005', combined_output, ghci_script, ['ghci005.script'])
-test('ghci006', [ combined_output,
-                  unless(opsys('mingw32') or (not config.have_ext_interp),extra_ways(['ghci-ext'])) ],
+test('ghci006', [ combined_output, req_rts_linker,
+                  unless(opsys('mingw32'),extra_ways(['ghci-ext'])) ],
                 ghci_script, ['ghci006.script'])
 test('ghci007', combined_output, ghci_script, ['ghci007.script'])
 test('ghci008', [ combined_output,
diff --git a/testsuite/tests/printer/all.T b/testsuite/tests/printer/all.T
index 879d2aa51ca8033b700e6eb82063a01f196cb2ea..3440f574585c1c0f851fe4fc165ab68447c24db1 100644
--- a/testsuite/tests/printer/all.T
+++ b/testsuite/tests/printer/all.T
@@ -24,7 +24,7 @@ test('Ppr023', ignore_stderr, makefile_test, ['ppr023'])
 test('Ppr024', ignore_stderr, makefile_test, ['ppr024'])
 test('Ppr025', ignore_stderr, makefile_test, ['ppr025'])
 test('Ppr026', ignore_stderr, makefile_test, ['ppr026'])
-test('Ppr027', ignore_stderr, makefile_test, ['ppr027'])
+test('Ppr027', [ignore_stderr, req_rts_linker], makefile_test, ['ppr027'])
 test('Ppr028', ignore_stderr, makefile_test, ['ppr028'])
 test('Ppr029', ignore_stderr, makefile_test, ['ppr029'])
 test('Ppr030', ignore_stderr, makefile_test, ['ppr030'])
@@ -37,22 +37,22 @@ test('Ppr036', ignore_stderr, makefile_test, ['ppr036'])
 test('Ppr037', ignore_stderr, makefile_test, ['ppr037'])
 test('Ppr038', ignore_stderr, makefile_test, ['ppr038'])
 test('Ppr039', ignore_stderr, makefile_test, ['ppr039'])
-test('Ppr040', ignore_stderr, makefile_test, ['ppr040'])
+test('Ppr040', [ignore_stderr, req_rts_linker], makefile_test, ['ppr040'])
 test('Ppr041', ignore_stderr, makefile_test, ['ppr041'])
 test('Ppr042', ignore_stderr, makefile_test, ['ppr042'])
-test('Ppr043', ignore_stderr, makefile_test, ['ppr043'])
+test('Ppr043', [ignore_stderr, req_rts_linker], makefile_test, ['ppr043'])
 test('Ppr044', ignore_stderr, makefile_test, ['ppr044'])
 test('Ppr045', ignore_stderr, makefile_test, ['ppr045'])
 test('Ppr046', ignore_stderr, makefile_test, ['ppr046'])
 test('Ppr047', expect_fail, makefile_test, ['ppr047'])
 test('Ppr048', ignore_stderr, makefile_test, ['ppr048'])
-test('T13199', ignore_stderr, makefile_test, ['T13199'])
+test('T13199', [ignore_stderr, req_rts_linker], makefile_test, ['T13199'])
 test('T13050p', ignore_stderr, makefile_test, ['T13050p'])
-test('T13550', ignore_stderr, makefile_test, ['T13550'])
-test('T13942', ignore_stderr, makefile_test, ['T13942'])
-test('T14289', ignore_stderr, makefile_test, ['T14289'])
-test('T14289b', ignore_stderr, makefile_test, ['T14289b'])
-test('T14289c', ignore_stderr, makefile_test, ['T14289c'])
+test('T13550', [ignore_stderr, req_rts_linker], makefile_test, ['T13550'])
+test('T13942', [ignore_stderr, req_rts_linker], makefile_test, ['T13942'])
+test('T14289', [ignore_stderr, req_rts_linker], makefile_test, ['T14289'])
+test('T14289b', [ignore_stderr, req_rts_linker], makefile_test, ['T14289b'])
+test('T14289c', [ignore_stderr, req_rts_linker], makefile_test, ['T14289c'])
 test('T14306', ignore_stderr, makefile_test, ['T14306'])
 test('T14343', normal, compile_fail, [''])
 test('T14343b', normal, compile_fail, [''])
diff --git a/testsuite/tests/quasiquotation/all.T b/testsuite/tests/quasiquotation/all.T
index 331f7c16ae76ec456e17862947e010f160588312..23263d9475aab0871f1e285e9ea8fd0ce3efea0c 100644
--- a/testsuite/tests/quasiquotation/all.T
+++ b/testsuite/tests/quasiquotation/all.T
@@ -6,7 +6,7 @@ test('T7918',
       only_ways([config.ghc_th_way]), unless(have_dynamic(), skip)],
      compile_and_run, ['-package ghc ' + config.ghc_th_way_flags])
 test('T14028',
-     [req_interp,
+     [req_interp, req_rts_linker,
       only_ways([config.ghc_th_way]),
       unless(config.have_ext_interp, skip),
       when(opsys('linux') and arch('x86_64'), expect_broken_for(17300, ['dyn']))],
diff --git a/testsuite/tests/rts/all.T b/testsuite/tests/rts/all.T
index 36f63c571ead24c7092b5837a5bb8f87f0003e3d..33853dc3d2bf067088786b841f0ac093ec304a66 100644
--- a/testsuite/tests/rts/all.T
+++ b/testsuite/tests/rts/all.T
@@ -395,6 +395,7 @@ test('keep-cafs',
     when(opsys('mingw32'), expect_broken (5987)),
     when(platform('powerpc64le-unknown-linux'), expect_broken(11261)),
     when(opsys('freebsd'), expect_broken(16035)),
+    req_rts_linker
   ],
   makefile_test, ['KeepCafs'])
 
diff --git a/testsuite/tests/rts/linker/all.T b/testsuite/tests/rts/linker/all.T
index 2f1bb2bb61a7633b23ae6ed1fb919783c6ce0c0e..d2bb5891fd0b202f58b72e26eef60cc97ab3edd4 100644
--- a/testsuite/tests/rts/linker/all.T
+++ b/testsuite/tests/rts/linker/all.T
@@ -56,17 +56,14 @@ def checkDynAsm(actual_file, normaliser):
 # separately now.
 # These should have extra_clean() arguments, but I need
 # to somehow extract out the name of DLLs to do that
-test('T5435_v_asm_a', [extra_files(['T5435.hs', 'T5435_asm.c']),
-                       unless(config.have_RTS_linker, skip)],
+test('T5435_v_asm_a', [extra_files(['T5435.hs', 'T5435_asm.c']), req_rts_linker],
      makefile_test, ['T5435_v_asm_a'])
 # this one just needs to run on linux, as darwin/mingw32 are covered
 # by the _a test already.
-test('T5435_v_asm_b', [extra_files(['T5435.hs', 'T5435_asm.c']),
-                       unless(config.have_RTS_linker, skip),
-                      when(opsys('darwin') or opsys('mingw32'), skip)],
+test('T5435_v_asm_b', [extra_files(['T5435.hs', 'T5435_asm.c']), req_rts_linker,
+                       when(opsys('darwin') or opsys('mingw32'), skip)],
      makefile_test, ['T5435_v_asm_b'])
-test('T5435_v_gcc', [extra_files(['T5435.hs', 'T5435_gcc.c']),
-                     unless(config.have_RTS_linker, skip)],
+test('T5435_v_gcc', [extra_files(['T5435.hs', 'T5435_gcc.c']), req_rts_linker],
      makefile_test, ['T5435_v_gcc'])
 test('T5435_dyn_asm', [extra_files(['T5435.hs', 'T5435_asm.c']),
                        check_stdout(checkDynAsm)],
@@ -75,8 +72,7 @@ test('T5435_dyn_gcc', extra_files(['T5435.hs', 'T5435_gcc.c']) , makefile_test,
 
 ######################################
 test('linker_unload',
-     [extra_files(['LinkerUnload.hs', 'Test.hs']),
-      unless(config.have_RTS_linker, skip)],
+     [extra_files(['LinkerUnload.hs', 'Test.hs']), req_rts_linker],
      makefile_test, ['linker_unload'])
 
 ######################################
diff --git a/testsuite/tests/rts/linker/unload_multiple_objs/all.T b/testsuite/tests/rts/linker/unload_multiple_objs/all.T
index 378177cf411f3d0df6fb4163dea110b91fa3a061..52f35b4e26de63793041dd0762d879d7cf91695b 100644
--- a/testsuite/tests/rts/linker/unload_multiple_objs/all.T
+++ b/testsuite/tests/rts/linker/unload_multiple_objs/all.T
@@ -1,4 +1,4 @@
 test('linker_unload_multiple_objs',
      [extra_files(['../LinkerUnload.hs', 'A.hs', 'B.hs', 'C.hs', 'D.hs',]),
-      unless(config.have_RTS_linker, skip)],
+      req_rts_linker],
      run_command, ['$MAKE -s --no-print-directory linker_unload_multiple_objs'])