1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-30 22:43:12 +03:00
* sysdeps/sparc/sparc64/dl-machine.h (elf_machine_rela):
	Ensure relocation doesn't clobber any bits outside of the
	immediate field for R_SPARC_TLS_LE_HIX22, R_SPARC_WDISP30,
	R_SPARC_HI22 and R_SPARC_H44.
This commit is contained in:
Ulrich Drepper
2006-09-09 11:21:48 +00:00
parent 346e6ad401
commit 2b6a801eed
8 changed files with 40 additions and 21 deletions

View File

@ -1,5 +1,5 @@
/* Machine-dependent ELF dynamic relocation inline functions. Sparc64 version.
Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
Free Software Foundation, Inc.
This file is part of the GNU C Library.
@ -623,7 +623,8 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
value = sym->st_value - sym_map->l_tls_offset
+ reloc->r_addend;
if (r_type == R_SPARC_TLS_LE_HIX22)
*reloc_addr = (*reloc_addr & 0xffc00000) | ((~value) >> 10);
*reloc_addr = (*reloc_addr & 0xffc00000)
| (((~value) >> 10) & 0x3fffff);
else
*reloc_addr = (*reloc_addr & 0xffffe000) | (value & 0x3ff)
| 0x1c00;
@ -653,7 +654,7 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
case R_SPARC_WDISP30:
*(unsigned int *) reloc_addr =
((*(unsigned int *)reloc_addr & 0xc0000000) |
((value - (Elf64_Addr) reloc_addr) >> 2));
(((value - (Elf64_Addr) reloc_addr) >> 2) & 0x3fffffff));
break;
/* MEDLOW code model relocs */
@ -665,7 +666,7 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
case R_SPARC_HI22:
*(unsigned int *) reloc_addr =
((*(unsigned int *)reloc_addr & 0xffc00000) |
(value >> 10));
((value >> 10) & 0x3fffff));
break;
case R_SPARC_OLO10:
*(unsigned int *) reloc_addr =
@ -677,7 +678,7 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
case R_SPARC_H44:
*(unsigned int *) reloc_addr =
((*(unsigned int *)reloc_addr & 0xffc00000) |
(value >> 22));
((value >> 22) & 0x3fffff));
break;
case R_SPARC_M44:
*(unsigned int *) reloc_addr =