Commit d79c1cb2 authored by wolfgang's avatar wolfgang
Browse files

[project @ 2005-04-07 05:27:16 by wolfgang]

Set the keepCAFs flag (required for GHCi with dynamic libraries) from an
__attribute__((constructor)) function linked to stage 2 ghc if GhcBuildDylibs
is set in mk/build.mk.

The previous hack (setting it from addDLL) didn't work, because a few CAFs
from libHSbase_dyn were evaluated before the Linker was first invoked by
GHCi.

MERGE TO STABLE
parent ba69efdd
......@@ -409,6 +409,16 @@ PKG_DEPENDS += template-haskell
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
......
#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;
}
......@@ -803,24 +803,6 @@ addDLL( char *dll_name )
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);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment