X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FLinker.c;h=3e42c0d4d21068a0c4431e7297a866778c5ecb30;hb=daa4d18454157f664a0ff333bb592bb0bd6b4edc;hp=2e37d7178e8a1a3e5522e26e0bb4573dc076d46f;hpb=1621421619df6f19dce3b8cb29471e5d3c731acb;p=ghc-hetmet.git diff --git a/ghc/rts/Linker.c b/ghc/rts/Linker.c index 2e37d71..3e42c0d 100644 --- a/ghc/rts/Linker.c +++ b/ghc/rts/Linker.c @@ -296,11 +296,13 @@ typedef struct _RtsSymbolVal { SymX(log) \ SymX(sqrt) \ SymX(memcpy) \ - SymX(stg_InstallConsoleEvent) \ + SymX(rts_InstallConsoleEvent) \ + SymX(rts_ConsoleHandlerDone) \ Sym(mktime) \ Sym(_imp___timezone) \ Sym(_imp___tzname) \ Sym(_imp___iob) \ + Sym(_imp___osver) \ Sym(localtime) \ Sym(gmtime) \ Sym(opendir) \ @@ -316,6 +318,14 @@ typedef struct _RtsSymbolVal { # define MAIN_CAP_SYM #endif +#if !defined(mingw32_HOST_OS) +#define RTS_USER_SIGNALS_SYMBOLS \ + SymX(startSignalHandler) \ + SymX(setIOManagerPipe) +#else +#define RTS_USER_SIGNALS_SYMBOLS /* nothing */ +#endif + #ifdef TABLES_NEXT_TO_CODE #define RTS_RET_SYMBOLS /* nothing */ #else @@ -589,7 +599,8 @@ typedef struct _RtsSymbolVal { SymX(word2Integerzh_fast) \ SymX(writeTVarzh_fast) \ SymX(xorIntegerzh_fast) \ - SymX(yieldzh_fast) + SymX(yieldzh_fast) \ + RTS_USER_SIGNALS_SYMBOLS #ifdef SUPPORT_LONG_LONGS #define RTS_LONG_LONG_SYMS \ @@ -802,24 +813,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); @@ -1111,7 +1104,19 @@ loadObj( char *path ) #endif n = ROUND_UP(oc->fileSize, pagesize); - oc->image = mmap(map_addr, n, PROT_EXEC|PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0); + + /* Link objects into the lower 2Gb on x86_64. GHC assumes the + * small memory model on this architecture (see gcc docs, + * -mcmodel=small). + */ +#ifdef x86_64_HOST_ARCH +#define EXTRA_MAP_FLAGS MAP_32BIT +#else +#define EXTRA_MAP_FLAGS 0 +#endif + + oc->image = mmap(map_addr, n, PROT_EXEC|PROT_READ|PROT_WRITE, + MAP_PRIVATE|EXTRA_MAP_FLAGS, fd, 0); if (oc->image == MAP_FAILED) barf("loadObj: can't map `%s'", path); @@ -1977,7 +1982,7 @@ ocGetNames_PEi386 ( ObjectCode* oc ) && 0 != strcmp(".stab", sectab_i->Name) && 0 != strcmp(".stabstr", sectab_i->Name) ) { - errorBelch("Unknown PEi386 section name `%s'", sectab_i->Name); + errorBelch("Unknown PEi386 section name `%s' (while processing: %s)", sectab_i->Name, oc->fileName); return 0; } @@ -2531,6 +2536,9 @@ ocVerifyImage_ELF ( ObjectCode* oc ) case EM_IA_64: IF_DEBUG(linker,debugBelch( "ia64" )); break; #endif case EM_PPC: IF_DEBUG(linker,debugBelch( "powerpc32" )); break; +#ifdef EM_X86_64 + case EM_X86_64: IF_DEBUG(linker,debugBelch( "x86_64" )); break; +#endif default: IF_DEBUG(linker,debugBelch( "unknown" )); errorBelch("%s: unknown architecture", oc->fileName); return 0; @@ -2944,7 +2952,7 @@ do_Elf_Rela_relocations ( ObjectCode* oc, char* ehdrC, target_shndx, symtab_shndx )); for (j = 0; j < nent; j++) { -#if defined(DEBUG) || defined(sparc_HOST_ARCH) || defined(ia64_HOST_ARCH) || defined(powerpc_HOST_ARCH) +#if defined(DEBUG) || defined(sparc_HOST_ARCH) || defined(ia64_HOST_ARCH) || defined(powerpc_HOST_ARCH) || defined(x86_64_HOST_ARCH) /* This #ifdef only serves to avoid unused-var warnings. */ Elf_Addr offset = rtab[j].r_offset; Elf_Addr P = targ + offset; @@ -3120,6 +3128,25 @@ do_Elf_Rela_relocations ( ObjectCode* oc, char* ehdrC, | (delta & 0x3fffffc); break; # endif + +#if x86_64_HOST_OS + case R_X86_64_64: + *(Elf64_Xword *)P = value; + break; + + case R_X86_64_PC32: + *(Elf64_Word *)P = (Elf64_Word) (value - P); + break; + + case R_X86_64_32: + *(Elf64_Word *)P = (Elf64_Word)value; + break; + + case R_X86_64_32S: + *(Elf64_Sword *)P = (Elf64_Sword)value; + break; +#endif + default: errorBelch("%s: unhandled ELF relocation(RelA) type %d\n", oc->fileName, ELF_R_TYPE(info)); @@ -3908,7 +3935,7 @@ static void machoInitSymbolsWithoutUnderscore() { extern void* symbolsWithoutUnderscore[]; void **p = symbolsWithoutUnderscore; - __asm__ volatile(".data\n_symbolsWithoutUnderscore:"); + __asm__ volatile(".globl _symbolsWithoutUnderscore\n.data\n_symbolsWithoutUnderscore:"); #undef Sym #define Sym(x) \