X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FLinker.c;h=107db26e1e7b45cc2f2bfe107a3e7a5f002b217e;hb=3cdb0ada5aecbcbe940bacf577c02c41bc65c629;hp=e1be5e6eb9603f0a3979d7636ed5f499a5debd91;hpb=25f1d5c51840bee2deeeb6613451cf3cd80536ea;p=ghc-hetmet.git diff --git a/rts/Linker.c b/rts/Linker.c index e1be5e6..107db26 100644 --- a/rts/Linker.c +++ b/rts/Linker.c @@ -21,12 +21,14 @@ #include "RtsFlags.h" #include "HsFFI.h" #include "Hash.h" +#include "Storage.h" +#include "Stable.h" #include "Linker.h" #include "LinkerInternals.h" #include "RtsUtils.h" #include "Schedule.h" -#include "Storage.h" #include "Sparks.h" +#include "RtsTypeable.h" #ifdef HAVE_SYS_TYPES_H #include @@ -333,6 +335,7 @@ typedef struct _RtsSymbolVal { Sym(mktime) \ Sym(_imp___timezone) \ Sym(_imp___tzname) \ + Sym(_imp__tzname) \ Sym(_imp___iob) \ Sym(_imp___osver) \ Sym(localtime) \ @@ -486,6 +489,7 @@ typedef struct _RtsSymbolVal { SymX(catchzh_fast) \ SymX(catchRetryzh_fast) \ SymX(catchSTMzh_fast) \ + SymX(checkzh_fast) \ SymX(closure_flags) \ SymX(cmp_thread) \ SymX(cmpIntegerzh_fast) \ @@ -507,6 +511,7 @@ typedef struct _RtsSymbolVal { SymX(forkOS_createThread) \ SymX(freeHaskellFunctionPtr) \ SymX(freeStablePtr) \ + SymX(getOrSetTypeableStore) \ SymX(gcdIntegerzh_fast) \ SymX(gcdIntegerIntzh_fast) \ SymX(gcdIntzh_fast) \ @@ -707,7 +712,8 @@ typedef struct _RtsSymbolVal { SymX(stg_interp_constr6_entry) \ SymX(stg_interp_constr7_entry) \ SymX(stg_interp_constr8_entry) \ - SymX(stgMallocBytesRWX) \ + SymX(allocateExec) \ + SymX(freeExec) \ SymX(getAllocations) \ SymX(revertCAFs) \ SymX(RtsFlags) \ @@ -823,7 +829,7 @@ initFreeList(rootEntry *table, nat n, rootEntry *free) root_ptr_free = table; } -void +static void initRootPtrTable(void) { if (RPT_size > 0) @@ -837,7 +843,7 @@ initRootPtrTable(void) } -void +static void enlargeRootPtrTable(void) { nat old_RPT_size = RPT_size; @@ -937,11 +943,6 @@ static int linker_init_done = 0 ; static void *dl_prog_handle; #endif -/* dlopen(NULL,..) doesn't work so we grab libc explicitly */ -#if defined(openbsd_HOST_OS) -static void *dl_libc_handle; -#endif - void initLinker( void ) { @@ -971,9 +972,6 @@ initLinker( void ) dl_prog_handle = RTLD_DEFAULT; # else dl_prog_handle = dlopen(NULL, RTLD_LAZY); -# if defined(openbsd_HOST_OS) - dl_libc_handle = dlopen("libc.so", RTLD_LAZY); -# endif # endif /* RTLD_DEFAULT */ # endif } @@ -1124,10 +1122,7 @@ lookupSymbol( char *lbl ) if (val == NULL) { # if defined(OBJFORMAT_ELF) -# if defined(openbsd_HOST_OS) - val = dlsym(dl_prog_handle, lbl); - return (val != NULL) ? val : dlsym(dl_libc_handle,lbl); -# elif defined(x86_64_HOST_ARCH) +# if defined(x86_64_HOST_ARCH) val = dlsym(dl_prog_handle, lbl); if (val >= (void *)0x80000000) { void *new_val; @@ -1137,7 +1132,7 @@ lookupSymbol( char *lbl ) } else { return val; } -# else /* not openbsd */ +# else return dlsym(dl_prog_handle, lbl); # endif # elif defined(OBJFORMAT_MACHO) @@ -2280,6 +2275,8 @@ ocGetNames_PEi386 ( ObjectCode* oc ) && 0 != strcmp(".stabstr", sectab_i->Name) /* ignore constructor section for now */ && 0 != strcmp(".ctors", sectab_i->Name) + /* ignore section generated from .ident */ + && 0!= strcmp("/4", sectab_i->Name) ) { errorBelch("Unknown PEi386 section name `%s' (while processing: %s)", sectab_i->Name, oc->fileName); return 0; @@ -2497,14 +2494,14 @@ ocResolve_PEi386 ( ObjectCode* oc ) + sym->Value); } else { copyName ( sym->Name, strtab, symbol, 1000-1 ); - (void*)S = lookupLocalSymbol( oc, symbol ); + S = (UInt32) lookupLocalSymbol( oc, symbol ); if ((void*)S != NULL) goto foundit; - (void*)S = lookupSymbol( symbol ); + S = (UInt32) lookupSymbol( symbol ); if ((void*)S != NULL) goto foundit; zapTrailingAtSign ( symbol ); - (void*)S = lookupLocalSymbol( oc, symbol ); + S = (UInt32) lookupLocalSymbol( oc, symbol ); if ((void*)S != NULL) goto foundit; - (void*)S = lookupSymbol( symbol ); + S = (UInt32) lookupSymbol( symbol ); if ((void*)S != NULL) goto foundit; /* Newline first because the interactive linker has printed "linking..." */ errorBelch("\n%s: unknown symbol `%s'", oc->fileName, symbol); @@ -2908,6 +2905,9 @@ ocVerifyImage_ELF ( ObjectCode* oc ) IF_DEBUG(linker,debugBelch( "Architecture is " )); switch (ehdr->e_machine) { case EM_386: IF_DEBUG(linker,debugBelch( "x86" )); break; +#ifdef EM_SPARC32PLUS + case EM_SPARC32PLUS: +#endif case EM_SPARC: IF_DEBUG(linker,debugBelch( "sparc" )); break; #ifdef EM_IA_64 case EM_IA_64: IF_DEBUG(linker,debugBelch( "ia64" )); break;