summaryrefslogtreecommitdiff
path: root/rts/Linker.c
diff options
context:
space:
mode:
authorClemens Fruhwirth <clemens@endorphin.org>2007-08-08 14:57:00 +0000
committerClemens Fruhwirth <clemens@endorphin.org>2007-08-08 14:57:00 +0000
commitc4a712034fee683a7f5d8db2c502b14ecf634d5a (patch)
treebbd8ec381ca4bdd903d23da54b4cfbb7ff9be569 /rts/Linker.c
parentd37d720f79f3269be95f3662a11009e6834023f6 (diff)
downloadhaskell-c4a712034fee683a7f5d8db2c502b14ecf634d5a.tar.gz
Add R_X86_64_PC64 relocation support to the Linker
Diffstat (limited to 'rts/Linker.c')
-rw-r--r--rts/Linker.c20
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",