This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH] Handle some new sparc relocation types.
- From: David Miller <davem at davemloft dot net>
- To: libc-alpha at sourceware dot org
- Date: Sat, 07 Apr 2012 12:31:33 -0400 (EDT)
- Subject: [PATCH] Handle some new sparc relocation types.
Committed to master.
* elf/elf.h (R_SPARC_WDISP10): Define.
* sysdeps/sparc/sparc32/dl-machine.h (elf_machine_rela): Handle
R_SPARC_SIZE32.
* sysdeps/sparc/sparc64/dl-machine.h (elf_machine_rela): Handle
R_SPARC_SIZE64 and R_SPARC_H34.
---
ChangeLog | 8 ++++++++
elf/elf.h | 1 +
sysdeps/sparc/sparc32/dl-machine.h | 6 ++++++
sysdeps/sparc/sparc64/dl-machine.h | 12 ++++++++++++
4 files changed, 27 insertions(+), 0 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 0544a89..cdecc65 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2012-04-07 David S. Miller <davem@davemloft.net>
+
+ * elf/elf.h (R_SPARC_WDISP10): Define.
+ * sysdeps/sparc/sparc32/dl-machine.h (elf_machine_rela): Handle
+ R_SPARC_SIZE32.
+ * sysdeps/sparc/sparc64/dl-machine.h (elf_machine_rela): Handle
+ R_SPARC_SIZE64 and R_SPARC_H34.
+
2012-04-07 Carlos O'Donell <carlos_odonell@mentor.com>
* elf/dynamic-link.h (_ELF_DYNAMIC_DO_RELOC): Simplify
diff --git a/elf/elf.h b/elf/elf.h
index a71de72..347d6d8 100644
--- a/elf/elf.h
+++ b/elf/elf.h
@@ -1327,6 +1327,7 @@ typedef struct
#define R_SPARC_H34 85
#define R_SPARC_SIZE32 86
#define R_SPARC_SIZE64 87
+#define R_SPARC_WDISP10 88
#define R_SPARC_JMP_IREL 248
#define R_SPARC_IRELATIVE 249
#define R_SPARC_GNU_VTINHERIT 250
diff --git a/sysdeps/sparc/sparc32/dl-machine.h b/sysdeps/sparc/sparc32/dl-machine.h
index 31b540a..2dfeeb2 100644
--- a/sysdeps/sparc/sparc32/dl-machine.h
+++ b/sysdeps/sparc/sparc32/dl-machine.h
@@ -359,6 +359,12 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
if (__builtin_expect (r_type == R_SPARC_NONE, 0))
return;
+ if (__builtin_expect (r_type == R_SPARC_SIZE32, 0))
+ {
+ *reloc_addr = sym->st_size + reloc->r_addend;
+ return;
+ }
+
#if !defined RTLD_BOOTSTRAP || !defined HAVE_Z_COMBRELOC
if (__builtin_expect (r_type == R_SPARC_RELATIVE, 0))
{
diff --git a/sysdeps/sparc/sparc64/dl-machine.h b/sysdeps/sparc/sparc64/dl-machine.h
index 4b14593..35c24d1 100644
--- a/sysdeps/sparc/sparc64/dl-machine.h
+++ b/sysdeps/sparc/sparc64/dl-machine.h
@@ -385,6 +385,12 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
if (__builtin_expect (r_type == R_SPARC_NONE, 0))
return;
+ if (__builtin_expect (r_type == R_SPARC_SIZE64, 0))
+ {
+ *reloc_addr = sym->st_size + reloc->r_addend;
+ return;
+ }
+
#if !defined RTLD_BOOTSTRAP || !defined HAVE_Z_COMBRELOC
if (__builtin_expect (r_type == R_SPARC_RELATIVE, 0))
{
@@ -552,6 +558,12 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
(((value & 0x3ff) + ELF64_R_TYPE_DATA (reloc->r_info)) & 0x1fff));
break;
+ /* ABS34 code model reloc */
+ case R_SPARC_H34:
+ *(unsigned int *) reloc_addr =
+ ((*(unsigned int *)reloc_addr & 0xffc00000) |
+ ((value >> 12) & 0x3fffff));
+
/* MEDMID code model relocs */
case R_SPARC_H44:
*(unsigned int *) reloc_addr =
--
1.7.9.1