[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: