From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31829 invoked by alias); 7 Sep 2006 22:09:48 -0000 Received: (qmail 31809 invoked by uid 22791); 7 Sep 2006 22:09:48 -0000 X-Spam-Check-By: sourceware.org Received: from sunsite.ms.mff.cuni.cz (HELO sunsite.mff.cuni.cz) (195.113.15.26) by sourceware.org (qpsmtpd/0.31) with ESMTP; Thu, 07 Sep 2006 22:09:44 +0000 Received: from sunsite.mff.cuni.cz (sunsite.mff.cuni.cz [127.0.0.1]) by sunsite.mff.cuni.cz (8.13.1/8.13.1) with ESMTP id k87M9dUf015520; Fri, 8 Sep 2006 00:09:39 +0200 Received: (from jj@localhost) by sunsite.mff.cuni.cz (8.13.1/8.13.1/Submit) id k87M9dIM015519; Fri, 8 Sep 2006 00:09:39 +0200 Date: Thu, 07 Sep 2006 22:09:00 -0000 From: Jakub Jelinek To: Ulrich Drepper , Roland McGrath Cc: Glibc hackers Subject: [PATCH] Fix sparc64 non-pic relocation handling Message-ID: <20060907220939.GZ4556@sunsite.mff.cuni.cz> Reply-To: Jakub Jelinek Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4.1i Mailing-List: contact libc-hacker-help@sourceware.org; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-hacker-owner@sourceware.org X-SW-Source: 2006-09/txt/msg00017.txt.bz2 Hi! These 4 are all non-PIC relocations, so they are pretty unlikely to work well in 64-bit programs, still, we shouldn't clobber the rest of the instructions (bits outside of the immediate field). E.g. for R_SPARC_WDISP30 that can happen even when the relocation doesn't overflow (if it is a call to a function located below the call insn, from -2GB to 4 bytes before it). 2006-09-07 Jakub Jelinek [BZ #1006] * 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. --- libc/sysdeps/sparc/sparc64/dl-machine.h 14 Apr 2005 21:39:27 -0000 1.50 +++ libc/sysdeps/sparc/sparc64/dl-machine.h 7 Sep 2006 21:54:30 -0000 @@ -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, 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, 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, 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, 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 = Jakub