diff --git a/rts/IOManager.c b/rts/IOManager.c
index 894a12cf4276d9cae47f8ac16a7733cc5d6652e0..04222af8fc7a16fead15baf90f280fe80b61a69d 100644
--- a/rts/IOManager.c
+++ b/rts/IOManager.c
@@ -20,6 +20,7 @@
 #include "IOManager.h"       // RTS internal
 #include "Capability.h"
 #include "Schedule.h"
+#include "Prelude.h"
 #include "RtsFlags.h"
 #include "RtsUtils.h"
 #include "sm/Evac.h"
@@ -296,8 +297,15 @@ void initIOManager(void)
 
     switch (iomgr_type) {
 
-        /* The IO_MANAGER_SELECT needs no global initialisation */
-
+#if defined(IOMGR_ENABLED_SELECT)
+        case IO_MANAGER_SELECT:
+            /* Make the exception CAF a GC root. See initBuiltinGcRoots for
+             * similar examples. We throw this exception if a thread tries to
+             * wait on an invalid FD.
+             */
+            getStablePtr((StgPtr)blockedOnBadFD_closure);
+            break;
+#endif
 #if defined(IOMGR_ENABLED_MIO_POSIX)
         case IO_MANAGER_MIO_POSIX:
             /* Posix implementation in posix/Signals.c
diff --git a/rts/RtsStartup.c b/rts/RtsStartup.c
index 70e926b44623fe9a65fd6df683e7b8cd93736059..4cb3a566d330bce09d5a3764b60ab7dd0fd9074f 100644
--- a/rts/RtsStartup.c
+++ b/rts/RtsStartup.c
@@ -211,7 +211,6 @@ static void initBuiltinGcRoots(void)
     getStablePtr((StgPtr)interruptIOManager_closure);
     getStablePtr((StgPtr)ioManagerCapabilitiesChanged_closure);
 #if !defined(mingw32_HOST_OS)
-    getStablePtr((StgPtr)blockedOnBadFD_closure);
     getStablePtr((StgPtr)runHandlersPtr_closure);
 #else
     getStablePtr((StgPtr)processRemoteCompletion_closure);