X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FLinker.c;h=a12ad22214871ee7e481f621adcd2f6230408a13;hb=6ea86573500e4a576d22feec71e36cf27c94aaa9;hp=d9e2b91ce26bb83667d3b3011fec6b7e36ec515b;hpb=7288088604bdec2d096ba11fd69571d27325d887;p=ghc-hetmet.git diff --git a/ghc/rts/Linker.c b/ghc/rts/Linker.c index d9e2b91..a12ad22 100644 --- a/ghc/rts/Linker.c +++ b/ghc/rts/Linker.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: Linker.c,v 1.47 2001/06/28 14:26:58 sewardj Exp $ + * $Id: Linker.c,v 1.53 2001/07/22 03:28:25 chak Exp $ * * (c) The GHC Team, 2000 * @@ -84,6 +84,7 @@ typedef struct _RtsSymbolVal { /* These are statically linked from the mingw libraries into the ghc executable, so we have to employ this hack. */ #define RTS_MINGW_ONLY_SYMBOLS \ + SymX(memset) \ SymX(inet_ntoa) \ SymX(inet_addr) \ SymX(htonl) \ @@ -150,6 +151,10 @@ typedef struct _RtsSymbolVal { SymX(GetExitCodeProcess) \ SymX(WaitForSingleObject) \ SymX(CreateProcessA) \ + Sym(__divdi3) \ + Sym(__udivdi3) \ + Sym(__moddi3) \ + Sym(__umoddi3) \ SymX(_errno) #endif @@ -330,41 +335,6 @@ typedef struct _RtsSymbolVal { #define RTS_LONG_LONG_SYMS /* nothing */ #else #define RTS_LONG_LONG_SYMS \ - SymX(stg_gtWord64) \ - SymX(stg_geWord64) \ - SymX(stg_eqWord64) \ - SymX(stg_neWord64) \ - SymX(stg_ltWord64) \ - SymX(stg_leWord64) \ - SymX(stg_gtInt64) \ - SymX(stg_geInt64) \ - SymX(stg_eqInt64) \ - SymX(stg_neInt64) \ - SymX(stg_ltInt64) \ - SymX(stg_leInt64) \ - SymX(stg_remWord64) \ - SymX(stg_quotWord64) \ - SymX(stg_remInt64) \ - SymX(stg_quotInt64) \ - SymX(stg_negateInt64) \ - SymX(stg_plusInt64) \ - SymX(stg_minusInt64) \ - SymX(stg_timesInt64) \ - SymX(stg_and64) \ - SymX(stg_or64) \ - SymX(stg_xor64) \ - SymX(stg_not64) \ - SymX(stg_shiftL64) \ - SymX(stg_shiftRL64) \ - SymX(stg_iShiftL64) \ - SymX(stg_iShiftRL64) \ - SymX(stg_iShiftRA64) \ - SymX(stg_intToInt64) \ - SymX(stg_int64ToInt) \ - SymX(stg_int64ToWord64) \ - SymX(stg_wordToWord64) \ - SymX(stg_word64ToWord) \ - SymX(stg_word64ToInt64) \ SymX(int64ToIntegerzh_fast) \ SymX(word64ToIntegerzh_fast) #endif /* SUPPORT_LONG_LONGS */ @@ -532,6 +502,15 @@ lookupSymbol( char *lbl ) void* sym; for (o_dll = opened_dlls; o_dll != NULL; o_dll = o_dll->next) { /* fprintf(stderr, "look in %s for %s\n", o_dll->name, lbl); */ + if (lbl[0] == '_') { + /* HACK: if the name has an initial underscore, try stripping + it off & look that up first. I've yet to verify whether there's + a Rule that governs whether an initial '_' *should always* be + stripped off when mapping from import lib name to the DLL name. + */ + sym = GetProcAddress(o_dll->instance, (lbl+1)); + if (sym != NULL) return sym; + } sym = GetProcAddress(o_dll->instance, lbl); if (sym != NULL) return sym; } @@ -1222,7 +1201,8 @@ ocGetNames_PEi386 ( ObjectCode* oc ) kind = SECTIONKIND_CODE_OR_RODATA; #endif - if (0==strcmp(".text",sectab_i->Name)) + if (0==strcmp(".text",sectab_i->Name) || + 0==strcmp(".rodata",sectab_i->Name)) kind = SECTIONKIND_CODE_OR_RODATA; if (0==strcmp(".data",sectab_i->Name) || 0==strcmp(".bss",sectab_i->Name)) @@ -1388,7 +1368,12 @@ ocResolve_PEi386 ( ObjectCode* oc ) #if defined(sparc_TARGET_ARCH) # define ELF_TARGET_SPARC /* Used inside */ +#elif defined(i386_TARGET_ARCH) +# define ELF_TARGET_386 /* Used inside */ #endif +/* There is a similar case for IA64 in the Solaris2 headers if this + * ever becomes relevant. + */ #include