X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FLinker.c;h=e86efd393a90a893e0c5805b9ee25d62630354fd;hb=6c278790358dc723fe574a593203993be46ab2fb;hp=1e007ac1e3d426ef26278eaec4dbe71c04c73699;hpb=b473ec1c5f526ff9c8e2224fe753d207c901aec2;p=ghc-hetmet.git diff --git a/rts/Linker.c b/rts/Linker.c index 1e007ac..e86efd3 100644 --- a/rts/Linker.c +++ b/rts/Linker.c @@ -646,7 +646,8 @@ typedef struct _RtsSymbolVal { SymX(stg_CAF_BLACKHOLE_info) \ SymX(awakenBlockedQueue) \ SymX(stg_CHARLIKE_closure) \ - SymX(stg_EMPTY_MVAR_info) \ + SymX(stg_MVAR_CLEAN_info) \ + SymX(stg_MVAR_DIRTY_info) \ SymX(stg_IND_STATIC_info) \ SymX(stg_INTLIKE_closure) \ SymX(stg_MUT_ARR_PTRS_DIRTY_info) \ @@ -731,6 +732,7 @@ typedef struct _RtsSymbolVal { SymX(rts_stop_next_breakpoint) \ SymX(rts_stop_on_exception) \ SymX(stopTimer) \ + SymX(n_capabilities) \ RTS_USER_SIGNALS_SYMBOLS #ifdef SUPPORT_LONG_LONGS @@ -946,13 +948,13 @@ typedef static OpenedDLL* opened_dlls = NULL; #endif -char * +const char * addDLL( char *dll_name ) { # if defined(OBJFORMAT_ELF) || defined(OBJFORMAT_MACHO) /* ------------------- ELF DLL loader ------------------- */ void *hdl; - char *errmsg; + const char *errmsg; initLinker(); @@ -1288,13 +1290,20 @@ loadObj( char *path ) /* Link objects into the lower 2Gb on x86_64. GHC assumes the * small memory model on this architecture (see gcc docs, * -mcmodel=small). + * + * MAP_32BIT not available on OpenBSD/amd64 */ -#ifdef x86_64_HOST_ARCH +#if defined(x86_64_HOST_ARCH) && defined(MAP_32BIT) #define EXTRA_MAP_FLAGS MAP_32BIT #else #define EXTRA_MAP_FLAGS 0 #endif + /* MAP_ANONYMOUS is MAP_ANON on some systems, e.g. OpenBSD */ +#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON) +#define MAP_ANONYMOUS MAP_ANON +#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) @@ -2558,9 +2567,6 @@ ocResolve_PEi386 ( ObjectCode* oc ) #if !defined(openbsd_HOST_OS) # include -# ifndef R_X86_64_PC64 /* If elf.h doesn't define it */ -# define R_X86_64_PC64 24 -# endif #else /* openbsd elf has things in different places, with diff names */ # include @@ -2569,6 +2575,11 @@ ocResolve_PEi386 ( ObjectCode* oc ) # define R_386_PC32 RELOC_PC32 #endif +/* If elf.h doesn't define it */ +# ifndef R_X86_64_PC64 +# define R_X86_64_PC64 24 +# endif + /* * Define a set of types which can be used for both ELF32 and ELF64 */ @@ -2766,7 +2777,7 @@ x86_64_high_symbol( char *lbl, void *addr ) x86_64_bounce_buffer = mmap(NULL, X86_64_BB_SIZE * sizeof(x86_64_bounce), PROT_EXEC|PROT_READ|PROT_WRITE, - MAP_PRIVATE|MAP_32BIT|MAP_ANONYMOUS, -1, 0); + MAP_PRIVATE|EXTRA_MAP_FLAGS|MAP_ANONYMOUS, -1, 0); if (x86_64_bounce_buffer == MAP_FAILED) { barf("x86_64_high_symbol: mmap failed"); } @@ -2894,8 +2905,12 @@ ocVerifyImage_ELF ( ObjectCode* oc ) #ifdef EM_X86_64 case EM_X86_64: IF_DEBUG(linker,debugBelch( "x86_64" )); break; #endif +#ifdef EM_AMD64 + case EM_AMD64: IF_DEBUG(linker,debugBelch( "amd64" )); break; +#endif default: IF_DEBUG(linker,debugBelch( "unknown" )); - errorBelch("%s: unknown architecture", oc->fileName); + errorBelch("%s: unknown architecture (e_machine == %d)" + , oc->fileName, ehdr->e_machine); return 0; } @@ -4236,7 +4251,7 @@ static int relocateSection( #ifdef powerpc_HOST_ARCH // In the .o file, this should be a relative jump to NULL // and we'll change it to a relative jump to the symbol - ASSERT(-word == reloc->r_address); + ASSERT(word + reloc->r_address == 0); jumpIsland = (unsigned long) &makeSymbolExtra(oc, reloc->r_symbolnum,