ALL_DIRS += ghci
+# If we are going to use dynamic libraries instead of .o files for ghci,
+# we will need to always retain CAFs in the compiler.
+# ghci/keepCAFsForGHCi contains a GNU C __attribute__((constructor))
+# function which sets the keepCAFs flag for the RTS before any Haskell
+# code is run.
+ifeq "$(GhcBuildDylibs)" "YES"
+else
+EXCLUDED_SRCS += ghci/keepCAFsForGHCi.c
+endif
+
# Enable readline if either:
# - we're building stage 1 and $(GhcHasReadline)="YES"
# - we're building stage 2/3, and we have built the readline package
--- /dev/null
+#include "Rts.h"
+#include "Storage.h"
+
+// This file is only included when GhcBuildDylibs is set in mk/build.mk.
+// It contains an __attribute__((constructor)) function (run prior to main())
+// which sets the keepCAFs flag in the RTS, before any Haskell code is run.
+// This is required so that GHCi can use dynamic libraries instead of HSxyz.o
+// files.
+
+static void keepCAFsForGHCi() __attribute__((constructor));
+
+static void keepCAFsForGHCi()
+{
+ keepCAFs = 1;
+}
void *hdl;
char *errmsg;
- // *** HACK
- // If we load libHSbase_cbits_dyn.[so|dylib],
- // then we know that we need to activate another newCAF
- // related hack in Storage.c because we can't redirect
- // newCAF to newDynCAF with the system dynamic linker.
-#ifdef OBJFORMAT_MACHO
- const char *hsbase = "/libHSbase_cbits_dyn.dylib";
-#else
- const char *hsbase = "/libHSbase_cbits_dyn.so";
-#endif
- int namelen = strlen(dll_name);
- int baselen = strlen(hsbase);
- if(namelen > baselen && !strcmp(dll_name + namelen - baselen, hsbase))
- {
- keepCAFs = rtsTrue;
- }
- // *** END HACK.
-
initLinker();
hdl= dlopen(dll_name, RTLD_NOW | RTLD_GLOBAL);