From 42729f43823193fe727274ae26f29fdfd9e1f169 Mon Sep 17 00:00:00 2001
From: Simon Marlow <marlowsd@gmail.com>
Date: Mon, 20 Aug 2012 15:13:45 +0100
Subject: [PATCH] add X86_64_GOTTPOFF relocation for errno

Submitted by: Markus Pfeiffer <markus.pfeiffer@morphism.de> on cvs-ghc
---
 rts/Linker.c | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/rts/Linker.c b/rts/Linker.c
index a2a3b3b19ad0..56003fb7469e 100644
--- a/rts/Linker.c
+++ b/rts/Linker.c
@@ -132,6 +132,10 @@
 #define ALWAYS_PIC
 #endif
 
+#if defined(dragonfly_HOST_OS)
+#include <sys/tls.h>
+#endif
+
 /* Hash table mapping symbol names to Symbol */
 static /*Str*/HashTable *symhash;
 
@@ -5202,6 +5206,27 @@ do_Elf_Rela_relocations ( ObjectCode* oc, char* ehdrC,
           *(Elf64_Word *)P = (Elf64_Word)off;
           break;
       }
+#if defined(dragonfly_HOST_OS)
+      case R_X86_64_GOTTPOFF:
+      {
+#if defined(ALWAYS_PIC)
+          barf("R_X86_64_GOTTPOFF relocation, but ALWAYS_PIC.");
+#else
+        /* determine the offset of S to the current thread's tls
+           area 
+           XXX: Move this to the beginning of function */
+          struct tls_info ti;
+          get_tls_area(0, &ti, sizeof(ti));
+          /* make entry in GOT that contains said offset */
+          StgInt64 gotEntry = (StgInt64) &makeSymbolExtra(oc, ELF_R_SYM(info), 
+                                         (S - (Elf64_Addr)(ti.base)))->addr;
+          *(Elf64_Word *)P = gotEntry + A - P;
+#endif
+          break;
+      }
+#endif
+
+
 
       case R_X86_64_PLT32:
       {
-- 
GitLab