X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;ds=sidebyside;f=ghc%2Frts%2FLinker.c;h=9744a34a60c4b45e70be8c949887d5525e0d0249;hb=d2ebcf24e738c858a9b999602795c25c32c82bcf;hp=9ee1858f4c267f5a7b4c16e3d5f794d1db8223e7;hpb=f97dcf9fc2ea2a419087bca53f2fea811c5181a9;p=ghc-hetmet.git diff --git a/ghc/rts/Linker.c b/ghc/rts/Linker.c index 9ee1858..9744a34 100644 --- a/ghc/rts/Linker.c +++ b/ghc/rts/Linker.c @@ -301,6 +301,7 @@ typedef struct _RtsSymbolVal { Sym(_imp___timezone) \ Sym(_imp___tzname) \ Sym(_imp___iob) \ + Sym(_imp___osver) \ Sym(localtime) \ Sym(gmtime) \ Sym(opendir) \ @@ -528,7 +529,6 @@ typedef struct _RtsSymbolVal { SymX(stable_ptr_table) \ SymX(stackOverflow) \ SymX(stg_CAF_BLACKHOLE_info) \ - SymX(stg_BLACKHOLE_BQ_info) \ SymX(awakenBlockedQueue) \ SymX(stg_CHARLIKE_closure) \ SymX(stg_EMPTY_MVAR_info) \ @@ -756,7 +756,7 @@ initLinker( void ) # if defined(openbsd_HOST_OS) dl_libc_handle = dlopen("libc.so", RTLD_LAZY); # endif -# endif // RTLD_DEFAULT +# endif /* RTLD_DEFAULT */ # endif } @@ -1094,7 +1094,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); @@ -2181,7 +2193,7 @@ ocResolve_PEi386 ( ObjectCode* oc ) /* Newline first because the interactive linker has printed "linking..." */ errorBelch("\n%s: unknown symbol `%s'", oc->fileName, symbol); return 0; - foundit: + foundit:; } checkProddableBlock(oc, pP); switch (reltab_j->Type) { @@ -2514,6 +2526,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; @@ -2927,7 +2942,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; @@ -3103,6 +3118,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)); @@ -3891,7 +3925,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) \