[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[PATCH] glibc 2.2.94 - hppa - plt relocations



libc-alpha,

The next patch fixes plt relocations for hppa.
Unfortunately this requires 'map' to be passed around 
like a hot potato. Any comments on this patch would
be much appreciated. 

Cheers,
Carlos

--- 

2002-09-22 Carlos O'Donell <carlos@baldric.uwo.ca>

        2001-11-14  Alan Modra <amodra@bigpond.net.au>

        * elf/do-rel.h:
        (elf_dynamic_do_rel): Add map to function call for
        'elf_machine_rel_relative'.
        * sysdeps/alpha/dl-machine.h
        (elf_machine_rela_relative): Added "struct link_map *map"
        to function definition.
        * sysdeps/arm/dl-machine.h: Likewise.
        * sysdeps/cris/dl-machine.h: Likewise.
        * sysdeps/hppa/dl-machine.h: 
	(elf_machine_rela_relative): Added "struct link_map *map"
	to function definition, and completed implementation.
        * sysdeps/i386/dl-machine.h: 
	(elf_machine_rela_relative): Added "struct link_map *map"
	to function definition.
        * sysdeps/ia64/dl-machine.h: Likewise.
        * sysdeps/m68k/dl-machine.h: Likewise.
        * sysdeps/mips/dl-machine.h: Likewise.
        * sysdeps/mips/mips64/dl-machine.h: Likewise.
        * sysdeps/powerpc/powerpc32/dl-machine.h: Likewise.
        * sysdeps/powerpc/powerpc64/dl-machine.h: Likewise.
        * sysdeps/s390/s390-32/dl-machine.h: Likewise.
        * sysdeps/s390/s390-64/dl-machine.h: Likewise.
        * sysdeps/sh/dl-machine.h: Likewise.
        * sysdeps/sparc/sparc32/dl-machine.h: Likewise.
        * sysdeps/sparc/sparc64/dl-machine.h: Likewise.
        * sysdeps/x86_64/dl-machine.h: Likewise.

diff -urN glibc-2.2.4.orig/elf/do-rel.h glibc-2.2.4/elf/do-rel.h
--- glibc-2.2.4.orig/elf/do-rel.h	Wed Nov 14 09:37:23 2001
+++ glibc-2.2.4/elf/do-rel.h	Wed Nov 14 09:46:02 2001
@@ -86,7 +86,7 @@
 # endif
 #endif
 	  for (; relative < r; ++relative)
-	    elf_machine_rel_relative (l_addr, relative,
+	    elf_machine_rel_relative (map, l_addr, relative,
 				      (void *) (l_addr + relative->r_offset));
 
       if (map->l_info[VERSYMIDX (DT_VERSYM)])
diff -urN glibc-2.2.4.orig/sysdeps/alpha/dl-machine.h glibc-2.2.4/sysdeps/alpha/dl-machine.h
--- glibc-2.2.4.orig/sysdeps/alpha/dl-machine.h	Wed Nov 14 09:37:24 2001
+++ glibc-2.2.4/sysdeps/alpha/dl-machine.h	Wed Nov 14 09:46:02 2001
@@ -537,7 +537,8 @@
 }
 
 static inline void
-elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
+elf_machine_rela_relative (struct link_map *map, Elf64_Addr l_addr,
+			   const Elf64_Rela *reloc,
 			   Elf64_Addr *const reloc_addr)
 {
   /* XXX Make some timings.  Maybe it's preverable to test for
diff -urN glibc-2.2.4.orig/sysdeps/arm/dl-machine.h glibc-2.2.4/sysdeps/arm/dl-machine.h
--- glibc-2.2.4.orig/sysdeps/arm/dl-machine.h	Wed Nov 14 09:37:24 2001
+++ glibc-2.2.4/sysdeps/arm/dl-machine.h	Wed Nov 14 09:46:02 2001
@@ -518,7 +518,8 @@
 }
 
 static inline void
-elf_machine_rel_relative (Elf32_Addr l_addr, const Elf32_Rel *reloc,
+elf_machine_rel_relative (struct link_map *map, Elf32_Addr l_addr,
+			  const Elf32_Rel *reloc,
 			  Elf32_Addr *const reloc_addr)
 {
   *reloc_addr += l_addr;
diff -urN glibc-2.2.4.orig/sysdeps/cris/dl-machine.h glibc-2.2.4/sysdeps/cris/dl-machine.h
--- glibc-2.2.4.orig/sysdeps/cris/dl-machine.h	Wed Nov 14 09:37:24 2001
+++ glibc-2.2.4/sysdeps/cris/dl-machine.h	Wed Nov 14 09:46:02 2001
@@ -366,7 +366,8 @@
 }
 
 static inline void
-elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
+elf_machine_rela_relative (struct link_map *map, Elf32_Addr l_addr,
+			   const Elf32_Rela *reloc,
 			   Elf32_Addr *const reloc_addr)
 {
   *reloc_addr = l_addr + reloc->r_addend;
diff -urN glibc-2.2.4.orig/sysdeps/hppa/dl-machine.h glibc-2.2.4/sysdeps/hppa/dl-machine.h
--- glibc-2.2.4.orig/sysdeps/hppa/dl-machine.h	Wed Nov 14 09:47:09 2001
+++ glibc-2.2.4/sysdeps/hppa/dl-machine.h	Wed Nov 14 09:46:02 2001
@@ -628,11 +629,51 @@
   *reloc_addr = value;
 }
 
+/* hppa doesn't have an R_PARISC_RELATIVE reloc, but uses relocs with
+   ELF32_R_SYM (info) == 0 for a similar purpose.  */
 static inline void
-elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
+elf_machine_rela_relative (struct link_map *map, Elf32_Addr l_addr,
+			   const Elf32_Rela *reloc,
 			   Elf32_Addr *const reloc_addr)
 {
-  /* XXX Nothing to do.  There is no relative relocation, right?  */
+  unsigned long const r_type = ELF32_R_TYPE (reloc->r_info);
+  Elf32_Addr value;
+
+  value = l_addr + reloc->r_addend;
+
+  if (ELF32_R_SYM (reloc->r_info) != 0)
+    asm volatile ("iitlbp	%r0,(%r0)");  /* Crash. */
+
+  switch (r_type)
+    {
+    case R_PARISC_DIR32:
+      /* .eh_frame can have unaligned relocs.  */
+      if ((unsigned long) reloc_addr & 3)
+	{
+	  char *rel_addr = (char *) reloc_addr;
+	  rel_addr[0] = value >> 24;
+	  rel_addr[1] = value >> 16;
+	  rel_addr[2] = value >> 8;
+	  rel_addr[3] = value;
+	  return;
+	}
+      break;
+
+    case R_PARISC_PLABEL32:
+      break;
+
+    case R_PARISC_IPLT:
+      elf_machine_fixup_plt (NULL, map, reloc, reloc_addr, value);
+      return;
+
+    case R_PARISC_NONE:
+      return;
+
+    default:
+      _dl_reloc_bad_type (map, r_type, 0);
+    }
+
+  *reloc_addr = value;
 }
 
 static inline void
diff -urN glibc-2.2.4.orig/sysdeps/i386/dl-machine.h glibc-2.2.4/sysdeps/i386/dl-machine.h
--- glibc-2.2.4.orig/sysdeps/i386/dl-machine.h	Wed Nov 14 09:37:24 2001
+++ glibc-2.2.4/sysdeps/i386/dl-machine.h	Wed Nov 14 09:46:02 2001
@@ -379,7 +379,8 @@
 }
 
 static inline void
-elf_machine_rel_relative (Elf32_Addr l_addr, const Elf32_Rel *reloc,
+elf_machine_rel_relative (struct link_map *map, Elf32_Addr l_addr,
+			  const Elf32_Rel *reloc,
 			  Elf32_Addr *const reloc_addr)
 {
   assert (ELF32_R_TYPE (reloc->r_info) == R_386_RELATIVE);
diff -urN glibc-2.2.4.orig/sysdeps/ia64/dl-machine.h glibc-2.2.4/sysdeps/ia64/dl-machine.h
--- glibc-2.2.4.orig/sysdeps/ia64/dl-machine.h	Wed Nov 14 09:37:24 2001
+++ glibc-2.2.4/sysdeps/ia64/dl-machine.h	Wed Nov 14 09:46:02 2001
@@ -580,7 +580,8 @@
 }
 
 static inline void
-elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
+elf_machine_rela_relative (struct link_map *map, Elf64_Addr l_addr,
+			   const Elf64_Rela *reloc,
 			   Elf64_Addr *const reloc_addr)
 {
   /* ??? Ignore MSB and Instruction format for now.  */
diff -urN glibc-2.2.4.orig/sysdeps/m68k/dl-machine.h glibc-2.2.4/sysdeps/m68k/dl-machine.h
--- glibc-2.2.4.orig/sysdeps/m68k/dl-machine.h	Wed Nov 14 09:37:24 2001
+++ glibc-2.2.4/sysdeps/m68k/dl-machine.h	Wed Nov 14 09:46:02 2001
@@ -299,7 +299,8 @@
 }
 
 static inline void
-elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
+elf_machine_rela_relative (struct link_map *map, Elf32_Addr l_addr,
+			   const Elf32_Rela *reloc,
 			   Elf32_Addr *const reloc_addr)
 {
   *reloc_addr = l_addr + reloc->r_addend;
diff -urN glibc-2.2.4.orig/sysdeps/mips/dl-machine.h glibc-2.2.4/sysdeps/mips/dl-machine.h
--- glibc-2.2.4.orig/sysdeps/mips/dl-machine.h	Wed Nov 14 09:37:24 2001
+++ glibc-2.2.4/sysdeps/mips/dl-machine.h	Wed Nov 14 09:46:02 2001
@@ -535,7 +535,8 @@
 }
 
 static inline void
-elf_machine_rel_relative (ElfW(Addr) l_addr, const ElfW(Rel) *reloc,
+elf_machine_rel_relative (struct link_map *map, ElfW(Addr) l_addr,
+			  const ElfW(Rel) *reloc,
 			  ElfW(Addr) *const reloc_addr)
 {
   /* XXX Nothing to do.  There is no relative relocation, right?  */
diff -urN glibc-2.2.4.orig/sysdeps/mips/mips64/dl-machine.h glibc-2.2.4/sysdeps/mips/mips64/dl-machine.h
--- glibc-2.2.4.orig/sysdeps/mips/mips64/dl-machine.h	Wed Nov 14 09:37:24 2001
+++ glibc-2.2.4/sysdeps/mips/mips64/dl-machine.h	Wed Nov 14 09:46:02 2001
@@ -576,7 +576,8 @@
 }
 
 static inline void
-elf_machine_rel_relative (ElfW(Addr) l_addr, const ElfW(Rel) *reloc,
+elf_machine_rel_relative (struct link_map *map, ElfW(Addr) l_addr,
+			  const ElfW(Rel) *reloc,
 			  ElfW(Addr) *const reloc_addr)
 {
   /* XXX Nothing to do.  There is no relative relocation, right?  */
diff -urN glibc-2.2.4.orig/sysdeps/powerpc/powerpc32/dl-machine.h glibc-2.2.4/sysdeps/powerpc/powerpc32/dl-machine.h
--- glibc-2.2.4.orig/sysdeps/powerpc/powerpc32/dl-machine.h	Wed Nov 14 09:37:24 2001
+++ glibc-2.2.4/sysdeps/powerpc/powerpc32/dl-machine.h	Wed Nov 14 09:46:02 2001
@@ -394,7 +394,8 @@
 }
 
 static inline void
-elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
+elf_machine_rela_relative (struct link_map *map, Elf32_Addr l_addr,
+			   const Elf32_Rela *reloc,
 			   Elf32_Addr *const reloc_addr)
 {
   *reloc_addr = l_addr + reloc->r_addend;
diff -urN glibc-2.2.4.orig/sysdeps/powerpc/powerpc64/dl-machine.h glibc-2.2.4/sysdeps/powerpc/powerpc64/dl-machine.h
--- glibc-2.2.4.orig/sysdeps/powerpc/powerpc64/dl-machine.h     Fri Sep 20 09:37:24 2002
+++ glibc-2.2.4/sysdeps/powerpc/powerpc64/dl-machine.h  Fri Sep 20 09:46:02 2002
@@ -394,7 +394,8 @@
 }

 static inline void
-elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
+elf_machine_rela_relative (struct link_map *map, Elf32_Addr l_addr,
+                          const Elf32_Rela *reloc,
                           Elf32_Addr *const reloc_addr)
 {
   *reloc_addr = l_addr + reloc->r_addend;
diff -urN glibc-2.2.4.orig/sysdeps/s390/s390-32/dl-machine.h glibc-2.2.4/sysdeps/s390/s390-32/dl-machine.h
--- glibc-2.2.4.orig/sysdeps/s390/s390-32/dl-machine.h	Wed Nov 14 09:37:24 2001
+++ glibc-2.2.4/sysdeps/s390/s390-32/dl-machine.h	Wed Nov 14 09:46:02 2001
@@ -440,7 +440,8 @@
 }
 
 static inline void
-elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
+elf_machine_rela_relative (struct link_map *map, Elf32_Addr l_addr,
+			   const Elf32_Rela *reloc,
 			   Elf32_Addr *const reloc_addr)
 {
   *reloc_addr = l_addr + reloc->r_addend;
diff -urN glibc-2.2.4.orig/sysdeps/s390/s390-64/dl-machine.h glibc-2.2.4/sysdeps/s390/s390-64/dl-machine.h
--- glibc-2.2.4.orig/sysdeps/s390/s390-64/dl-machine.h	Wed Nov 14 09:37:24 2001
+++ glibc-2.2.4/sysdeps/s390/s390-64/dl-machine.h	Wed Nov 14 09:46:02 2001
@@ -420,7 +420,8 @@
 }
 
 static inline void
-elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
+elf_machine_rela_relative (struct link_map *map, Elf64_Addr l_addr,
+			   const Elf64_Rela *reloc,
 			   Elf64_Addr *const reloc_addr)
 {
   *reloc_addr = l_addr + reloc->r_addend;
diff -urN glibc-2.2.4.orig/sysdeps/sh/dl-machine.h glibc-2.2.4/sysdeps/sh/dl-machine.h
--- glibc-2.2.4.orig/sysdeps/sh/dl-machine.h	Wed Nov 14 09:37:24 2001
+++ glibc-2.2.4/sysdeps/sh/dl-machine.h	Wed Nov 14 09:46:02 2001
@@ -558,7 +558,8 @@
 }
 
 static inline void
-elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
+elf_machine_rela_relative (struct link_map *map, Elf32_Addr l_addr,
+			   const Elf32_Rela *reloc,
 			   Elf32_Addr *const reloc_addr)
 {
   Elf32_Addr value;
diff -urN glibc-2.2.4.orig/sysdeps/sparc/sparc32/dl-machine.h glibc-2.2.4/sysdeps/sparc/sparc32/dl-machine.h
--- glibc-2.2.4.orig/sysdeps/sparc/sparc32/dl-machine.h	Wed Nov 14 09:37:24 2001
+++ glibc-2.2.4/sysdeps/sparc/sparc32/dl-machine.h	Wed Nov 14 09:46:02 2001
@@ -461,7 +461,8 @@
 }
 
 static inline void
-elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
+elf_machine_rela_relative (struct link_map *map, Elf32_Addr l_addr,
+			   const Elf32_Rela *reloc,
 			   Elf32_Addr *const reloc_addr)
 {
   *reloc_addr += l_addr + reloc->r_addend;
diff -urN glibc-2.2.4.orig/sysdeps/sparc/sparc64/dl-machine.h glibc-2.2.4/sysdeps/sparc/sparc64/dl-machine.h
--- glibc-2.2.4.orig/sysdeps/sparc/sparc64/dl-machine.h	Wed Nov 14 09:37:24 2001
+++ glibc-2.2.4/sysdeps/sparc/sparc64/dl-machine.h	Wed Nov 14 09:46:02 2001
@@ -413,7 +413,8 @@
 }
 
 static inline void
-elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
+elf_machine_rela_relative (struct link_map *map, Elf64_Addr l_addr,
+			   const Elf64_Rela *reloc,
 			   Elf64_Addr *const reloc_addr)
 {
   *reloc_addr = l_addr + reloc->r_addend;
diff -urN glibc-2.2.4.orig/sysdeps/x86_64/dl-machine.h glibc-2.2.4/sysdeps/x86_64/dl-machine.h
--- glibc-2.2.4.orig/sysdeps/x86_64/dl-machine.h	Wed Nov 14 09:37:24 2001
+++ glibc-2.2.4/sysdeps/x86_64/dl-machine.h	Wed Nov 14 09:46:02 2001
@@ -393,7 +393,8 @@
 }
 
 static inline void
-elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
+elf_machine_rela_relative (struct link_map *map, Elf64_Addr l_addr,
+			   const Elf64_Rela *reloc,
 			   Elf64_Addr *const reloc_addr)
 {
   assert (ELF64_R_TYPE (reloc->r_info) == R_X86_64_RELATIVE);

Reply to: