diff --git a/testsuite/mk/boilerplate.mk b/testsuite/mk/boilerplate.mk
index 41ba2542a6477478194edbc45632ac34e7a183fd..a2fb56d1ba15bfecd52bd4fc97b64b30a5f3ef36 100644
--- a/testsuite/mk/boilerplate.mk
+++ b/testsuite/mk/boilerplate.mk
@@ -291,4 +291,9 @@ DARWIN = YES
 else
 DARWIN = NO
 endif
+ifeq "$(HostOS)" "freebsd"
+FREEBSD = YES
+else
+FREEBSD = NO
+endif
 
diff --git a/testsuite/tests/ghci/linking/Makefile b/testsuite/tests/ghci/linking/Makefile
index 085e81765beda4da9cd0937a2905e8d8e7416a1a..2c71e96cc68f2056f7ebbe0fa4c2ddb087bd1b2e 100644
--- a/testsuite/tests/ghci/linking/Makefile
+++ b/testsuite/tests/ghci/linking/Makefile
@@ -24,6 +24,12 @@ else
 DLL = lib$1.so
 endif
 
+ifeq "$(FREEBSD)" "YES"
+LIBCXX=c++
+else
+LIBCXX=stdc++
+endif
+
 .PHONY: ghcilink002
 ghcilink002 :
 	$(RM) -rf dir002
@@ -38,7 +44,7 @@ ghcilink002 :
 
 .PHONY: ghcilink003
 ghcilink003 :
-	echo ":q" | "$(TEST_HC)" $(TEST_HC_OPTS_INTERACTIVE) -lstdc++
+	echo ":q" | "$(TEST_HC)" $(TEST_HC_OPTS_INTERACTIVE) -l$(LIBCXX)
 
 # Test 4:
 #   package P
@@ -115,7 +121,7 @@ ghcilink006 :
 ifeq "$(WINDOWS)" "YES"
 	echo "extra-libraries: stdc++-6" >>$(PKG006)
 else
-	echo "extra-libraries: stdc++" >>$(PKG006)
+	echo "extra-libraries: $(LIBCXX)" >>$(PKG006)
 endif
 	'$(GHC_PKG)' init $(LOCAL_PKGCONF006)
 	'$(GHC_PKG)' --no-user-package-db -f $(LOCAL_PKGCONF006) register $(PKG006) -v0
diff --git a/testsuite/tests/ghci/linking/all.T b/testsuite/tests/ghci/linking/all.T
index 79ec5e5f987c7e10befb308e4707b9a1928f97fa..743067518f0df89fb054fdcae772d7bdc05b1986 100644
--- a/testsuite/tests/ghci/linking/all.T
+++ b/testsuite/tests/ghci/linking/all.T
@@ -12,8 +12,8 @@ test('ghcilink002', [extra_files(['TestLink.hs', 'f.c']),
 
 test('ghcilink003',
      [unless(doing_ghci, skip),
-      # libstdc++ is named differently on FreeBSD
-      when(opsys('freebsd'), expect_broken(17739))],
+      # libstdc++ is GCC-specific on FreeBSD
+      when(opsys('freebsd'), fragile(17739))],
      makefile_test,
      ['ghcilink003'])
 
@@ -32,8 +32,8 @@ test('ghcilink005',
 
 test('ghcilink006',
      [unless(doing_ghci, skip),
-      # libstdc++ is named differently on FreeBSD
-      when(opsys('freebsd'), expect_broken(17739))],
+      # libstdc++ is GCC-specific on FreeBSD
+      when(opsys('freebsd'), fragile(17739))],
      makefile_test,
      ['ghcilink006'])
 
diff --git a/testsuite/tests/quasiquotation/Makefile b/testsuite/tests/quasiquotation/Makefile
index 76e8a928fb9f9a1e64b93705ffde4143c8cdee55..9a9db1ead9bbcdcb2ba6bf567e06208ebbf8421a 100644
--- a/testsuite/tests/quasiquotation/Makefile
+++ b/testsuite/tests/quasiquotation/Makefile
@@ -11,5 +11,5 @@ T4150:
 
 T14028:
 	'$(TEST_HC)' $(TEST_HC_OPTS) -v0 T14028Quote.hs
-	'$(TEST_HC)' $(TEST_HC_OPTS) -v0 -c T14028C.c
+	'$(TEST_HC)' $(TEST_HC_OPTS) -v0 -fPIC -c T14028C.c
 	'$(TEST_HC)' $(TEST_HC_OPTS) -v0 -fexternal-interpreter T14028 T14028C.o
diff --git a/testsuite/tests/quasiquotation/all.T b/testsuite/tests/quasiquotation/all.T
index 0d2fd713cb924e09431662d0f44ad17069b62468..e8b3bd1e6f30682001865db97df57b3eff39792f 100644
--- a/testsuite/tests/quasiquotation/all.T
+++ b/testsuite/tests/quasiquotation/all.T
@@ -9,6 +9,5 @@ test('T14028',
      [req_interp, req_rts_linker,
       only_ways([config.ghc_th_way]),
       unless(config.have_ext_interp, skip),
-      when(opsys('linux') and arch('arm'), expect_broken_for(17558, ['dyn'])),
-      when(opsys('linux') and arch('x86_64'), expect_broken_for(17300, ['dyn']))],
+      when(opsys('freebsd'), expect_broken(19723))],
      makefile_test, ['T14028'])
diff --git a/testsuite/tests/th/all.T b/testsuite/tests/th/all.T
index 564649b3736ba1837df7835704310bdbf3e3e5f5..857c9f3659ad07378e96dd004d53928342a40b13 100644
--- a/testsuite/tests/th/all.T
+++ b/testsuite/tests/th/all.T
@@ -395,8 +395,9 @@ test('T13098', normal, compile, ['-v0'])
 test('T11046', normal, multimod_compile, ['T11046','-v0'])
 test('T13366',
      [expect_broken_for(13366, ['ghci']),
-      # libstdc++ is named differently on FreeBSD
-      when(opsys('freebsd'), expect_broken(17739)),
+      # libstdc++ is GCC-specific on FreeBSD, the test will
+      # fail with clang, and pass with GCC.
+      when(opsys('freebsd'), fragile(17739)),
       when(opsys('darwin'), expect_broken(16083))],
      compile_and_run,
      ['-lstdc++ -v0'])