Add R_X86_64_PC64 relocation support to the Linker
authorClemens Fruhwirth <clemens@endorphin.org>
Wed, 8 Aug 2007 14:57:00 +0000 (14:57 +0000)
committerClemens Fruhwirth <clemens@endorphin.org>
Wed, 8 Aug 2007 14:57:00 +0000 (14:57 +0000)
rts/Linker.c

index 6d5a8cf..2d50280 100644 (file)
@@ -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",