diff --git a/src/kernel_internals/runtime/system_config.ml.in b/src/kernel_internals/runtime/system_config.ml.in
index 028fd90f61dc36f31d07c00a11b2203cc1f9dedb..2b7603df5668b699624ab649e439058fe9cfc5dc 100644
--- a/src/kernel_internals/runtime/system_config.ml.in
+++ b/src/kernel_internals/runtime/system_config.ml.in
@@ -56,9 +56,27 @@ module Plugins = struct
   let load name =
     Config_data.Plugins.Plugins.load name
 
+  let try_load_list load list =
+    let list = list () in
+    List.iter (fun p ->
+        try
+          load p
+        with e ->
+          (* We don't have access to Kernel's log mechanisms here. *)
+          Format.printf "Warning: failed to load plugin '%s' (exception: %s)@."
+            p (Printexc.to_string e);
+          Format.printf "         Try recompiling it or \
+                         completely removing it from the plug-in load path:@.";
+          List.iter (fun path -> Format.printf "         %s@." path)
+            Config_data.Plugins.Plugins.paths
+      ) list
+
   let load_all () =
-    if is_gui then Config_data.Plugins.Plugins_gui.load_all ();
-    Config_data.Plugins.Plugins.load_all ()
+    (* avoid calling Dune_site.Plugins.load_all () directly, so we can catch
+       errors individually *)
+    let open Config_data.Plugins in
+    if is_gui then try_load_list Plugins_gui.load Plugins_gui.list;
+    try_load_list Plugins.load Plugins.list
 end
 
 module Preprocessor = struct