about summary refs log tree commit diff
path: root/sysdeps/powerpc
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/powerpc')
-rw-r--r--sysdeps/powerpc/dl-tls.h (renamed from sysdeps/powerpc/powerpc64/dl-tls.h)5
-rw-r--r--sysdeps/powerpc/powerpc64/dl-machine.h86
2 files changed, 34 insertions, 57 deletions
diff --git a/sysdeps/powerpc/powerpc64/dl-tls.h b/sysdeps/powerpc/dl-tls.h
index a353bbc4ae..37b96749f8 100644
--- a/sysdeps/powerpc/powerpc64/dl-tls.h
+++ b/sysdeps/powerpc/dl-tls.h
@@ -1,4 +1,4 @@
-/* Thread-local storage handling in the ELF dynamic linker.  PowerPC64 version.
+/* Thread-local storage handling in the ELF dynamic linker.  PowerPC version.
    Copyright (C) 2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
@@ -30,6 +30,9 @@ typedef struct
 
 extern void *__tls_get_addr (tls_index *ti);
 
+/* The thread pointer points 0x7000 past the first static TLS block.  */
+# define TLS_TP_OFFSET		0x7000
+
 /* Dynamic thread vector pointers point 0x8000 past the start of each
    TLS block.  */
 # define TLS_DTV_OFFSET		0x8000
diff --git a/sysdeps/powerpc/powerpc64/dl-machine.h b/sysdeps/powerpc/powerpc64/dl-machine.h
index 7d7e78677a..e9cb54b685 100644
--- a/sysdeps/powerpc/powerpc64/dl-machine.h
+++ b/sysdeps/powerpc/powerpc64/dl-machine.h
@@ -1,4 +1,4 @@
-/* Machine-dependent ELF dynamic relocation inline functions.  
+/* Machine-dependent ELF dynamic relocation inline functions.
    PowerPC64 version.
    Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
    Free Software Foundation, Inc.
@@ -386,7 +386,7 @@ elf_machine_runtime_setup (struct link_map *map, int lazy, int profile)
 
       /* Relocate the DT_PPC64_GLINK entry in the _DYNAMIC section.
 	 elf_get_dynamic_info takes care of the standard entries but
-	 doesn't know exactly what to do with processor specific 
+	 doesn't know exactly what to do with processor specific
 	 entires.  */
       if (info[DT_PPC64(GLINK)] != NULL)
 	info[DT_PPC64(GLINK)]->d_un.d_ptr += l_addr;
@@ -425,7 +425,7 @@ elf_machine_runtime_setup (struct link_map *map, int lazy, int profile)
 	  plt_reserve->fd_func += l_addr;
 	  plt_reserve->fd_toc  += l_addr;
 #endif
-	  
+
 	  /* Set up the lazy PLT entries.  */
 	  glink = (Elf64_Word *) D_PTR (map, l_info[DT_PPC64(GLINK)]);
 	  offset = PLT_INITIAL_ENTRY_WORDS;
@@ -516,7 +516,7 @@ elf_machine_plt_value (struct link_map *map, const Elf64_Rela *reloc,
 {
   return value + reloc->r_addend;
 }
- 
+
 #endif /* dl_machine_h */
 
 #ifdef RESOLVE_MAP
@@ -560,20 +560,10 @@ elf_machine_rela (struct link_map *map,
   Elf64_Addr value, raw_value;
 #ifndef RTLD_BOOTSTRAP
   const Elf64_Sym *const refsym = sym;
-  /* This is defined in rtld.c, but nowhere in the static libc.a; make the
-     reference weak so static programs can still link.  This declaration
-     cannot be done when compiling rtld.c (i.e.  #ifdef RTLD_BOOTSTRAP)
-     because rtld.c contains the common defn for _dl_rtld_map, which is
-     incompatible with a weak decl in the same file.  */
-  weak_extern (GL(dl_rtld_map));
 #endif
 
   if (r_type == R_PPC64_RELATIVE)
     {
-#ifndef RTLD_BOOTSTRAP
-      /* Already done in dynamic linker.  */
-      if (map != &GL(dl_rtld_map))
-#endif
       *reloc_addr = map->l_addr + reloc->r_addend;
       return;
     }
@@ -581,37 +571,21 @@ elf_machine_rela (struct link_map *map,
   if (r_type == R_PPC64_NONE)
     return;
 
-  value = 0;
-  raw_value = 0;
-
-#if defined USE_TLS && !defined RTLD_BOOTSTRAP
   sym_map = RESOLVE_MAP (&sym, version, r_type);
-  raw_value = value = reloc->r_addend;
+  value = raw_value = reloc->r_addend;
   if (sym_map)
-    if (sym)
     {
       raw_value += sym->st_value;
       value = raw_value + sym_map->l_addr;
     }
-#else
-  sym_map = RESOLVE_MAP (&sym, version, r_type);
-  if (sym_map)
-  {
-    if (sym)
-    {
-      raw_value = sym->st_value + sym_map->l_addr;
-    }
-    value = raw_value + reloc->r_addend;
-  }
-#endif
 
   switch (r_type)
     {
     case R_PPC64_ADDR64:
     case R_PPC64_GLOB_DAT:
-      *reloc_addr = value;      
+      *reloc_addr = value;
       return;
-      
+
 #if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD)
 
     case R_PPC64_DTPMOD64:
@@ -620,34 +594,34 @@ elf_machine_rela (struct link_map *map,
       *reloc_addr = 1;
 #else
     /* Get the information from the link map returned by the
-       resolv function.  */
+       resolve function.  */
       if (sym_map != NULL)
-        {
-          *reloc_addr = sym_map->l_tls_modid;
-        }
+	*reloc_addr = sym_map->l_tls_modid;
 #endif
       return;
-      
+
     case R_PPC64_TPREL64:
 #ifdef RTLD_BOOTSTRAP
-      *reloc_addr = raw_value + map->l_tls_offset - 0x7010;
+      *reloc_addr = (sym_map->l_tls_offset - TLS_TCB_SIZE
+		     + raw_value - TLS_TP_OFFSET);
 #else
       if (sym_map)
-      {
-        CHECK_STATIC_TLS (map, sym_map);
-        *reloc_addr = raw_value + sym_map->l_tls_offset - 0x7010;
-      }
+	{
+	  CHECK_STATIC_TLS (map, sym_map);
+	  *reloc_addr = (sym_map->l_tls_offset - TLS_TCB_SIZE
+			 + raw_value - TLS_TP_OFFSET);
+	}
 #endif
       return;
-      
+
     case R_PPC64_DTPREL64:
 #ifndef RTLD_BOOTSTRAP
       /* During relocation all TLS symbols are defined and used.
-       Therefore the offset is already correct.  */
-      *reloc_addr = raw_value - 0x8000;
+	 Therefore the offset is already correct.  */
+      *reloc_addr = raw_value - TLS_DTV_OFFSET;
 #endif
       return;
-#endif      
+#endif
 
     case R_PPC64_JMP_SLOT:
 
@@ -657,7 +631,7 @@ elf_machine_rela (struct link_map *map,
 #ifndef RTLD_BOOTSTRAP /* None of the following appear in ld.so */
     case R_PPC64_ADDR16_LO_DS:
       if (dont_expect ((value & 3) != 0))
-        _dl_reloc_overflow (map, "R_PPC64_ADDR16_LO_DS", 
+        _dl_reloc_overflow (map, "R_PPC64_ADDR16_LO_DS",
                             reloc_addr, sym, refsym);
       *(Elf64_Half *) reloc_addr = BIT_INSERT (*(Elf64_Half *) reloc_addr,
 					       value, 0xfffc);
@@ -665,7 +639,7 @@ elf_machine_rela (struct link_map *map,
 
     case R_PPC64_TPREL16_LO_DS:
       if (dont_expect ((value & 3) != 0))
-        _dl_reloc_overflow (map, "R_PPC64_TPREL16_LO_DS", 
+        _dl_reloc_overflow (map, "R_PPC64_TPREL16_LO_DS",
                             reloc_addr, sym, refsym);
       *(Elf64_Half *) reloc_addr = BIT_INSERT (*(Elf64_Half *) reloc_addr,
                                               value, 0xfffc);
@@ -673,7 +647,7 @@ elf_machine_rela (struct link_map *map,
 
     case R_PPC64_DTPREL16_LO_DS:
       if (dont_expect ((value & 3) != 0))
-        _dl_reloc_overflow (map, "R_PPC64_DTPREL16_LO_DS", 
+        _dl_reloc_overflow (map, "R_PPC64_DTPREL16_LO_DS",
                             reloc_addr, sym, refsym);
       *(Elf64_Half *) reloc_addr = BIT_INSERT (*(Elf64_Half *) reloc_addr,
                                               value, 0xfffc);
@@ -681,7 +655,7 @@ elf_machine_rela (struct link_map *map,
 
     case R_PPC64_GOT_TPREL16_LO_DS:
       if (dont_expect ((value & 3) != 0))
-        _dl_reloc_overflow (map, "R_PPC64_GOT_TPREL16_LO_DS", 
+        _dl_reloc_overflow (map, "R_PPC64_GOT_TPREL16_LO_DS",
                             reloc_addr, sym, refsym);
       *(Elf64_Half *) reloc_addr = BIT_INSERT (*(Elf64_Half *) reloc_addr,
                                               value, 0xfffc);
@@ -689,7 +663,7 @@ elf_machine_rela (struct link_map *map,
 
     case R_PPC64_GOT_DTPREL16_LO_DS:
       if (dont_expect ((value & 3) != 0))
-        _dl_reloc_overflow (map, "R_PPC64_GOT_DTPREL16_LO_DS", 
+        _dl_reloc_overflow (map, "R_PPC64_GOT_DTPREL16_LO_DS",
                             reloc_addr, sym, refsym);
       *(Elf64_Half *) reloc_addr = BIT_INSERT (*(Elf64_Half *) reloc_addr,
                                               value, 0xfffc);
@@ -800,7 +774,7 @@ elf_machine_rela (struct link_map *map,
 
     case R_PPC64_TPREL16_DS:
       if (dont_expect ((value + 0x8000) >= 0x10000 || (value & 3) != 0))
-        _dl_reloc_overflow (map, "R_PPC64_TPREL16_DS", reloc_addr, 
+        _dl_reloc_overflow (map, "R_PPC64_TPREL16_DS", reloc_addr,
                             sym, refsym);
       *(Elf64_Half *) reloc_addr = BIT_INSERT (*(Elf64_Half *) reloc_addr,
                                               value, 0xfffc);
@@ -808,7 +782,7 @@ elf_machine_rela (struct link_map *map,
 
     case R_PPC64_DTPREL16_DS:
       if (dont_expect ((value + 0x8000) >= 0x10000 || (value & 3) != 0))
-        _dl_reloc_overflow (map, "R_PPC64_DTPREL16_DS", reloc_addr, 
+        _dl_reloc_overflow (map, "R_PPC64_DTPREL16_DS", reloc_addr,
                             sym, refsym);
       *(Elf64_Half *) reloc_addr = BIT_INSERT (*(Elf64_Half *) reloc_addr,
                                               value, 0xfffc);
@@ -816,7 +790,7 @@ elf_machine_rela (struct link_map *map,
 
     case R_PPC64_GOT_TPREL16_DS:
       if (dont_expect ((value + 0x8000) >= 0x10000 || (value & 3) != 0))
-        _dl_reloc_overflow (map, "R_PPC64_GOT_TPREL16_DS", reloc_addr, 
+        _dl_reloc_overflow (map, "R_PPC64_GOT_TPREL16_DS", reloc_addr,
                             sym, refsym);
       *(Elf64_Half *) reloc_addr = BIT_INSERT (*(Elf64_Half *) reloc_addr,
                                               value, 0xfffc);
@@ -824,7 +798,7 @@ elf_machine_rela (struct link_map *map,
 
     case R_PPC64_GOT_DTPREL16_DS:
       if (dont_expect ((value + 0x8000) >= 0x10000 || (value & 3) != 0))
-        _dl_reloc_overflow (map, "R_PPC64_GOT_DTPREL16_DS", 
+        _dl_reloc_overflow (map, "R_PPC64_GOT_DTPREL16_DS",
                             reloc_addr, sym, refsym);
       *(Elf64_Half *) reloc_addr = BIT_INSERT (*(Elf64_Half *) reloc_addr,
                                               value, 0xfffc);