diff options
Diffstat (limited to 'rts')
-rw-r--r-- | rts/Linker.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/rts/Linker.c b/rts/Linker.c index 6d5a8cf021..2d502808fa 100644 --- a/rts/Linker.c +++ b/rts/Linker.c @@ -2534,13 +2534,16 @@ ocResolve_PEi386 ( ObjectCode* oc ) #endif #if !defined(openbsd_HOST_OS) -#include <elf.h> +# include <elf.h> +# 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 <elf_abi.h> -#include <machine/reloc.h> -#define R_386_32 RELOC_32 -#define R_386_PC32 RELOC_PC32 +# include <elf_abi.h> +# include <machine/reloc.h> +# define R_386_32 RELOC_32 +# define R_386_PC32 RELOC_PC32 #endif /* @@ -3484,6 +3487,13 @@ do_Elf_Rela_relocations ( ObjectCode* oc, char* ehdrC, break; } + case R_X86_64_PC64: + { + StgInt64 off = value - P; + *(Elf64_Word *)P = (Elf64_Word)off; + break; + } + case R_X86_64_32: if (value >= 0x7fffffffL) { barf("R_X86_64_32 relocation out of range: %s = %p\n", |