X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FLinker.c;h=edad92ee4da75f7f45700ea0f1a5ac73d4296fc3;hb=cdbc494c6932d2ffa32d211bb988a635124bf016;hp=d8ec9f0cb41ba7a92278a0d3f90aec61e8e96951;hpb=db0c13a482893243cc829bbc253862e65f437cbe;p=ghc-hetmet.git diff --git a/rts/Linker.c b/rts/Linker.c index d8ec9f0..edad92e 100644 --- a/rts/Linker.c +++ b/rts/Linker.c @@ -13,8 +13,8 @@ /* Linux needs _GNU_SOURCE to get RTLD_DEFAULT from and MREMAP_MAYMOVE from . */ -#ifdef __linux__ -#define _GNU_SOURCE +#if defined(__linux__) || defined(__GLIBC__) +#define _GNU_SOURCE 1 #endif #include "Rts.h" @@ -40,6 +40,7 @@ #include #endif +#include #include #include #include @@ -72,7 +73,8 @@ #if defined(linux_HOST_OS ) || defined(freebsd_HOST_OS) || \ defined(dragonfly_HOST_OS) || defined(netbsd_HOST_OS ) || \ defined(openbsd_HOST_OS ) || \ - ( defined(darwin_HOST_OS ) && !defined(powerpc_HOST_ARCH) ) + ( defined(darwin_HOST_OS ) && !defined(powerpc_HOST_ARCH) ) || \ + defined(kfreebsdgnu_HOST_OS) /* Don't use mmap on powerpc-apple-darwin as mmap doesn't support * reallocating but we need to allocate jump islands just after each * object images. Otherwise relative branches to jump islands can fail @@ -88,7 +90,7 @@ #endif -#if defined(linux_HOST_OS) || defined(solaris2_HOST_OS) || defined(freebsd_HOST_OS) || defined(dragonfly_HOST_OS) || defined(netbsd_HOST_OS) || defined(openbsd_HOST_OS) +#if defined(linux_HOST_OS) || defined(solaris2_HOST_OS) || defined(freebsd_HOST_OS) || defined(kfreebsdgnu_HOST_OS) || defined(dragonfly_HOST_OS) || defined(netbsd_HOST_OS) || defined(openbsd_HOST_OS) # define OBJFORMAT_ELF # include // regex is already used by dlopen() so this is OK // to use here without requiring an additional lib @@ -270,6 +272,7 @@ typedef struct _RtsSymbolVal { SymI_HasProto(signal_handlers) \ SymI_HasProto(stg_sig_install) \ SymI_HasProto(rtsTimerSignal) \ + SymI_HasProto(atexit) \ SymI_NeedsProto(nocldstop) #endif @@ -1589,7 +1592,7 @@ mmap_again: } else { if ((W_)result > 0x80000000) { // oops, we were given memory over 2Gb -#if defined(freebsd_HOST_OS) || defined(dragonfly_HOST_OS) +#if defined(freebsd_HOST_OS) || defined(kfreebsdgnu_HOST_OS) || defined(dragonfly_HOST_OS) // Some platforms require MAP_FIXED. This is normally // a bad idea, because MAP_FIXED will overwrite // existing mappings. @@ -4651,8 +4654,8 @@ static int relocateSection( } IF_DEBUG(linker, - debugBelch("relocateSection: length = %d, thing = %d, baseValue = %p\n", - reloc->r_length, thing, baseValue)); + debugBelch("relocateSection: length = %d, thing = %" PRId64 ", baseValue = %p\n", + reloc->r_length, thing, (char *)baseValue)); if (type == X86_64_RELOC_GOT || type == X86_64_RELOC_GOT_LOAD) @@ -4688,9 +4691,12 @@ static int relocateSection( } else { - value = sections[reloc->r_symbolnum-1].offset - - sections[reloc->r_symbolnum-1].addr - + (uint64_t) image; + // If the relocation is not through the global offset table + // or external, then set the value to the baseValue. This + // will leave displacements into the __const section + // unchanged (as they ought to be). + + value = baseValue; } IF_DEBUG(linker, debugBelch("relocateSection: value = %p\n", (void *)value));