This is the mail archive of the libc-alpha@sources.redhat.com mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: don't assume reloc_addr passed to elf_machine_rel* is aligned


On Jun 24, 2003, Roland McGrath <roland@redhat.com> wrote:

> Even in a case like i386, I wonder if the use as void * in memcpy for
> R_386_COPY relocs might be a possible source of trouble.

This is exactly how this whole thing started.  mips has to use memcpy
for all its relocations, but since both pointers might carry 32-bit or
64-bit alignment info, we might still get aligned loads and stores.

The patch below renames the reloc_addr argument to reloc_addr_arg,
while changing its type to void*, and re-introduces reloc_addr as a
variable of the original type in functions that still reference the
original type.  This is what the original patch did, except that the
argument is now named reloc_addr_arg, instead of just reloc_addr_.

The patch also renames uses of reloc_addr that seemed to indicate the
alignment assumptions compilers might be tempted to make are
unwarranted into uses of reloc_addr_arg, that (presumably) carries no
alignment information.  I hope I haven't missed any, and that I didn't
introduce any typos in the process.  It's extremely unlikely that
these changes could possibly introduce run-time errors, but there
could always be unwanted interactions with compilers, so...  Wish me
luck :-)

Ok to install?

Index: ChangeLog
from  Alexandre Oliva  <aoliva@redhat.com>

	* elf/dynamic-link.h (elf_machine_rel, elf_machine_rela,
	elf_machine_rel_relative, elf_machine_rela_relative): Don't assume
	reloc_addr is aligned.
	* sysdeps/alpha/dl-machine.h (elf_machine_rela,
	elf_machine_rela_relative): Adjust.
	* sysdeps/arm/dl-machine.h (elf_machine_rel, elf_machine_rela,
	elf_machine_rel_relative, elf_machine_rela_relative): Adjust.
	* sysdeps/cris/dl-machine.h (elf_machine_rela,
	elf_machine_rela_relative): Adjust.
	* sysdeps/hppa/dl-machine.h (elf_machine_rela,
	elf_machine_rela_relative): Adjust.
	* sysdeps/i386/dl-machine.h (elf_machine_rel, elf_machine_rela,
	elf_machine_rel_relative, elf_machine_rela_relative): Adjust.
	* sysdeps/ia64/dl-machine.h (elf_machine_rela,
	elf_machine_rela_relative): Adjust.
	* sysdeps/m68k/dl-machine.h (elf_machine_rela,
	elf_machine_rela_relative): Adjust.
	* sysdeps/mips/dl-machine.h (elf_machine_rela,
	elf_machine_rela_relative): Adjust.
	* sysdeps/powerpc/powerpc32/dl-machine.h (elf_machine_rela,
	elf_machine_rela_relative): Adjust.
	* sysdeps/powerpc/powerpc64/dl-machine.h
	(elf_machine_rela_relative, elf_machine_rela): Adjust.
	* sysdeps/s390/s390-32/dl-machine.h (elf_machine_rela,
	elf_machine_rela_relative): Adjust.
	* sysdeps/s390/s390-64/dl-machine.h (elf_machine_rela,
	elf_machine_rela_relative): 
	* sysdeps/sh/dl-machine.h (elf_machine_rela,
	elf_machine_rela_relative): Adjust.
	* sysdeps/sparc/sparc32/dl-machine.h (elf_machine_rela,
	elf_machine_rela_relative): Adjust.
	* sysdeps/sparc/sparc64/dl-machine.h (elf_machine_rela) 
	(elf_machine_rela_relative): Adjust.
	* sysdeps/x86_64/dl-machine.h (elf_machine_rela) 
	(elf_machine_rela_relative): Adjust.

Index: sysdeps/alpha/dl-machine.h
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/alpha/dl-machine.h,v
retrieving revision 1.70
diff -u -p -r1.70 dl-machine.h
--- sysdeps/alpha/dl-machine.h 6 Jun 2003 05:54:14 -0000 1.70
+++ sysdeps/alpha/dl-machine.h 26 Jun 2003 08:55:00 -0000
@@ -512,8 +512,9 @@ elf_machine_rela (struct link_map *map,
 		  const Elf64_Rela *reloc,
 		  const Elf64_Sym *sym,
 		  const struct r_found_version *version,
-		  Elf64_Addr *const reloc_addr)
+		  void *const reloc_addr_arg)
 {
+  Elf64_Addr *const reloc_addr = reloc_addr_arg;
   unsigned long int const r_type = ELF64_R_TYPE (reloc->r_info);
 
 #if !defined RTLD_BOOTSTRAP && !defined HAVE_Z_COMBRELOC && !defined SHARED
@@ -538,15 +539,14 @@ elf_machine_rela (struct link_map *map,
 	{
 	  /* XXX Make some timings.  Maybe it's preferable to test for
 	     unaligned access and only do it the complex way if necessary.  */
-	  void *reloc_addr_1 = reloc_addr;
 	  Elf64_Addr reloc_addr_val;
 
 	  /* Load value without causing unaligned trap. */
-	  memcpy (&reloc_addr_val, reloc_addr_1, 8);
+	  memcpy (&reloc_addr_val, reloc_addr_arg, 8);
 	  reloc_addr_val += map->l_addr;
 
 	  /* Store value without causing unaligned trap. */
-	  memcpy (reloc_addr_1, &reloc_addr_val, 8);
+	  memcpy (reloc_addr_arg, &reloc_addr_val, 8);
 	}
     }
   else
@@ -598,10 +598,8 @@ elf_machine_rela (struct link_map *map,
 #ifndef RTLD_BOOTSTRAP
       else if (r_type == R_ALPHA_REFQUAD)
 	{
-	  void *reloc_addr_1 = reloc_addr;
-
 	  /* Store value without causing unaligned trap.  */
-	  memcpy (reloc_addr_1, &sym_value, 8);
+	  memcpy (reloc_addr_arg, &sym_value, 8);
 	}
 #endif
 #if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD)
@@ -649,19 +647,18 @@ elf_machine_rela (struct link_map *map,
 
 static inline void
 elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
-			   Elf64_Addr *const reloc_addr)
+			   void *const reloc_addr_arg)
 {
-  /* XXX Make some timings.  Maybe it's preverable to test for
+  /* XXX Make some timings.  Maybe it's preferable to test for 
      unaligned access and only do it the complex way if necessary.  */
-  void *reloc_addr_1 = reloc_addr;
   Elf64_Addr reloc_addr_val;
 
   /* Load value without causing unaligned trap. */
-  memcpy (&reloc_addr_val, reloc_addr_1, 8);
+  memcpy (&reloc_addr_val, reloc_addr_arg, 8);
   reloc_addr_val += l_addr;
 
   /* Store value without causing unaligned trap. */
-  memcpy (reloc_addr_1, &reloc_addr_val, 8);
+  memcpy (reloc_addr_arg, &reloc_addr_val, 8);
 }
 
 static inline void
Index: sysdeps/arm/dl-machine.h
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/arm/dl-machine.h,v
retrieving revision 1.42
diff -u -p -r1.42 dl-machine.h
--- sysdeps/arm/dl-machine.h 15 Nov 2002 22:51:20 -0000 1.42
+++ sysdeps/arm/dl-machine.h 26 Jun 2003 08:55:00 -0000
@@ -1,5 +1,6 @@
 /* Machine-dependent ELF dynamic relocation inline functions.  ARM version.
-   Copyright (C) 1995,96,97,98,99,2000,2001,2002 Free Software Foundation, Inc.
+   Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
+	Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -419,8 +420,9 @@ fix_bad_pc24 (Elf32_Addr *const reloc_ad
 static inline void
 elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
 		 const Elf32_Sym *sym, const struct r_found_version *version,
-		 Elf32_Addr *const reloc_addr)
+		 void *const reloc_addr_arg)
 {
+  Elf32_Addr *const reloc_addr = reloc_addr_arg;
   const unsigned int r_type = ELF32_R_TYPE (reloc->r_info);
 
 #if !defined RTLD_BOOTSTRAP || !defined HAVE_Z_COMBRELOC
@@ -470,8 +472,8 @@ elf_machine_rel (struct link_map *map, c
 				rtld_progname ?: "<program name unknown>",
 				strtab + refsym->st_name);
 	    }
-	  memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
-						   refsym->st_size));
+	  memcpy (reloc_addr_arg, (void *) value,
+		  MIN (sym->st_size, refsym->st_size));
 	  break;
 	case R_ARM_GLOB_DAT:
 	case R_ARM_JUMP_SLOT:
@@ -544,8 +546,9 @@ elf_machine_rel (struct link_map *map, c
 static inline void
 elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
 		  const Elf32_Sym *sym, const struct r_found_version *version,
-		  Elf32_Addr *const reloc_addr)
+		  void *const reloc_addr_arg)
 {
+  Elf32_Addr *const reloc_addr = reloc_addr_arg;
   const unsigned int r_type = ELF32_R_TYPE (reloc->r_info);
 
   if (__builtin_expect (r_type == R_ARM_RELATIVE, 0))
@@ -581,8 +584,8 @@ elf_machine_rela (struct link_map *map, 
 				rtld_progname ?: "<program name unknown>",
 				strtab + refsym->st_name);
 	    }
-	  memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
-						   refsym->st_size));
+	  memcpy (reloc_addr_arg, (void *) value,
+		  MIN (sym->st_size, refsym->st_size));
 	  break;
 #  endif /* !RESOLVE_CONFLICT_FIND_MAP */
 	case R_ARM_GLOB_DAT:
@@ -623,16 +626,18 @@ elf_machine_rela (struct link_map *map, 
 
 static inline void
 elf_machine_rel_relative (Elf32_Addr l_addr, const Elf32_Rel *reloc,
-			  Elf32_Addr *const reloc_addr)
+			  void *const reloc_addr_arg)
 {
+  Elf32_Addr *const reloc_addr = reloc_addr_arg;
   *reloc_addr += l_addr;
 }
 
 # ifndef RTLD_BOOTSTRAP
 static inline void
 elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
-			   Elf32_Addr *const reloc_addr)
+			   void *const reloc_addr_arg)
 {
+  Elf32_Addr *const reloc_addr = reloc_addr_arg;
   *reloc_addr = l_addr + reloc->r_addend;
 }
 # endif
Index: sysdeps/cris/dl-machine.h
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/cris/dl-machine.h,v
retrieving revision 1.10
diff -u -p -r1.10 dl-machine.h
--- sysdeps/cris/dl-machine.h 28 Aug 2002 21:23:07 -0000 1.10
+++ sysdeps/cris/dl-machine.h 26 Jun 2003 08:55:00 -0000
@@ -1,5 +1,5 @@
 /* Machine-dependent ELF dynamic relocation inline functions.  CRIS version.
-   Copyright (C) 1996-2001, 2002 Free Software Foundation, Inc.
+   Copyright (C) 1996-2001, 2002, 2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -280,8 +280,9 @@ elf_machine_plt_value (struct link_map *
 static inline void
 elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
 		  const Elf32_Sym *sym, const struct r_found_version *version,
-		  Elf32_Addr *const reloc_addr)
+		  void *const reloc_addr_arg)
 {
+  Elf32_Addr *const reloc_addr = reloc_addr_arg;
   const unsigned int r_type = ELF32_R_TYPE (reloc->r_info);
 
   if (__builtin_expect (r_type == R_CRIS_RELATIVE, 0))
@@ -322,8 +323,8 @@ elf_machine_rela (struct link_map *map, 
 				rtld_progname ?: "<program name unknown>",
 				strtab + refsym->st_name);
 	    }
-	  memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
-						   refsym->st_size));
+	  memcpy (reloc_addr_arg, (void *) value,
+		  MIN (sym->st_size, refsym->st_size));
 	  break;
 
 	case R_CRIS_32:
@@ -364,8 +365,9 @@ elf_machine_rela (struct link_map *map, 
 
 static inline void
 elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
-			   Elf32_Addr *const reloc_addr)
+			   void *const reloc_addr_arg)
 {
+  Elf32_Addr *const reloc_addr = reloc_addr_arg;
   *reloc_addr = l_addr + reloc->r_addend;
 }
 
Index: sysdeps/hppa/dl-machine.h
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/hppa/dl-machine.h,v
retrieving revision 1.18
diff -u -p -r1.18 dl-machine.h
--- sysdeps/hppa/dl-machine.h 28 Sep 2002 04:34:00 -0000 1.18
+++ sysdeps/hppa/dl-machine.h 26 Jun 2003 08:55:00 -0000
@@ -1,5 +1,6 @@
 /* Machine-dependent ELF dynamic relocation inline functions.  PA-RISC version.
-   Copyright (C) 1995-1997,1999,2000,2001,2002 Free Software Foundation, Inc.
+   Copyright (C) 1995-1997,1999,2000,2001,2002, 2003
+	Free Software Foundation, Inc.
    Contributed by David Huggins-Daines <dhd@debian.org>
    This file is part of the GNU C Library.
 
@@ -481,8 +482,9 @@ asm (									\
 static inline void
 elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
 		  const Elf32_Sym *sym, const struct r_found_version *version,
-		  Elf32_Addr *const reloc_addr)
+		  void *const reloc_addr_arg)
 {
+  Elf32_Addr *const reloc_addr = reloc_addr_arg;
   const Elf32_Sym *const refsym = sym;
   unsigned long const r_type = ELF32_R_TYPE (reloc->r_info);
   struct link_map *sym_map;
@@ -531,9 +533,9 @@ elf_machine_rela (struct link_map *map, 
 	return;
 #endif
       /* .eh_frame can have unaligned relocs.  */
-      if ((unsigned long) reloc_addr & 3)
+      if ((unsigned long) reloc_addr_arg & 3)
 	{
-	  char *rel_addr = (char *) reloc_addr;
+	  char *rel_addr = (char *) reloc_addr_arg;
 	  rel_addr[0] = value >> 24;
 	  rel_addr[1] = value >> 16;
 	  rel_addr[2] = value >> 8;
@@ -614,7 +616,7 @@ elf_machine_rela (struct link_map *map, 
 			    rtld_progname ?: "<program name unknown>",
 			    strtab + refsym->st_name);
 	}
-      memcpy (reloc_addr, (void *) value,
+      memcpy (reloc_addr_arg, (void *) value,
 	      MIN (sym->st_size, refsym->st_size));
       return;
 
@@ -637,8 +639,9 @@ elf_machine_rela (struct link_map *map, 
 static inline void
 elf_machine_rela_relative (struct link_map *map, Elf32_Addr l_addr,
 			   const Elf32_Rela *reloc,
-			   Elf32_Addr *const reloc_addr)
+			   void *const reloc_addr_arg)
 {
+  Elf32_Addr *const reloc_addr = reloc_addr_arg;
   unsigned long const r_type = ELF32_R_TYPE (reloc->r_info);
   Elf32_Addr value;
 
@@ -651,9 +654,9 @@ elf_machine_rela_relative (struct link_m
     {
     case R_PARISC_DIR32:
       /* .eh_frame can have unaligned relocs.  */
-      if ((unsigned long) reloc_addr & 3)
+      if ((unsigned long) reloc_addr_arg & 3)
 	{
-	  char *rel_addr = (char *) reloc_addr;
+	  char *rel_addr = (char *) reloc_addr_arg;
 	  rel_addr[0] = value >> 24;
 	  rel_addr[1] = value >> 16;
 	  rel_addr[2] = value >> 8;
Index: sysdeps/i386/dl-machine.h
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/i386/dl-machine.h,v
retrieving revision 1.120
diff -u -p -r1.120 dl-machine.h
--- sysdeps/i386/dl-machine.h 11 Jun 2003 22:29:43 -0000 1.120
+++ sysdeps/i386/dl-machine.h 26 Jun 2003 08:55:01 -0000
@@ -391,8 +391,9 @@ elf_machine_plt_value (struct link_map *
 static inline void
 elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
 		 const Elf32_Sym *sym, const struct r_found_version *version,
-		 Elf32_Addr *const reloc_addr)
+		 void *const reloc_addr_arg)
 {
+  Elf32_Addr *const reloc_addr = reloc_addr_arg;
   const unsigned int r_type = ELF32_R_TYPE (reloc->r_info);
 
 #if !defined RTLD_BOOTSTRAP || !defined HAVE_Z_COMBRELOC
@@ -519,8 +520,8 @@ elf_machine_rel (struct link_map *map, c
 				rtld_progname ?: "<program name unknown>",
 				strtab + refsym->st_name);
 	    }
-	  memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
-						   refsym->st_size));
+	  memcpy (reloc_addr_arg, (void *) value,
+		  MIN (sym->st_size, refsym->st_size));
 	  break;
 	default:
 	  _dl_reloc_bad_type (map, r_type, 0);
@@ -534,8 +535,9 @@ elf_machine_rel (struct link_map *map, c
 static inline void
 elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
 		  const Elf32_Sym *sym, const struct r_found_version *version,
-		  Elf32_Addr *const reloc_addr)
+		  void *const reloc_addr_arg)
 {
+  Elf32_Addr *const reloc_addr = reloc_addr_arg;
   const unsigned int r_type = ELF32_R_TYPE (reloc->r_info);
 
   if (ELF32_R_TYPE (reloc->r_info) == R_386_RELATIVE)
@@ -618,8 +620,8 @@ elf_machine_rela (struct link_map *map, 
 				rtld_progname ?: "<program name unknown>",
 				strtab + refsym->st_name);
 	    }
-	  memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
-						   refsym->st_size));
+	  memcpy (reloc_addr_arg, (void *) value,
+		  MIN (sym->st_size, refsym->st_size));
 	  break;
 # endif /* !RESOLVE_CONFLICT_FIND_MAP */
 	default:
@@ -634,8 +636,9 @@ elf_machine_rela (struct link_map *map, 
 
 static inline void
 elf_machine_rel_relative (Elf32_Addr l_addr, const Elf32_Rel *reloc,
-			  Elf32_Addr *const reloc_addr)
+			  void *const reloc_addr_arg)
 {
+  Elf32_Addr *const reloc_addr = reloc_addr_arg;
   assert (ELF32_R_TYPE (reloc->r_info) == R_386_RELATIVE);
   *reloc_addr += l_addr;
 }
@@ -643,8 +646,9 @@ elf_machine_rel_relative (Elf32_Addr l_a
 #ifndef RTLD_BOOTSTRAP
 static inline void
 elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
-			   Elf32_Addr *const reloc_addr)
+			   void *const reloc_addr_arg)
 {
+  Elf32_Addr *const reloc_addr = reloc_addr_arg;
   *reloc_addr = l_addr + reloc->r_addend;
 }
 #endif	/* !RTLD_BOOTSTRAP */
Index: sysdeps/ia64/dl-machine.h
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/ia64/dl-machine.h,v
retrieving revision 1.26
diff -u -p -r1.26 dl-machine.h
--- sysdeps/ia64/dl-machine.h 2 May 2003 02:38:19 -0000 1.26
+++ sysdeps/ia64/dl-machine.h 26 Jun 2003 08:55:01 -0000
@@ -507,8 +507,9 @@ elf_machine_rela (struct link_map *map,
 		  const Elf64_Rela *reloc,
 		  const Elf64_Sym *sym,
 		  const struct r_found_version *version,
-		  Elf64_Addr *const reloc_addr)
+		  void *const reloc_addr_arg)
 {
+  Elf64_Addr *const reloc_addr = reloc_addr_arg;
   const unsigned long int r_type = ELF64_R_TYPE (reloc->r_info);
   Elf64_Addr value;
 
@@ -607,8 +608,9 @@ elf_machine_rela (struct link_map *map,
 
 static inline void
 elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
-			   Elf64_Addr *const reloc_addr)
+			   void *const reloc_addr_arg)
 {
+  Elf64_Addr *const reloc_addr = reloc_addr_arg;
   /* ??? Ignore MSB and Instruction format for now.  */
   assert (ELF64_R_TYPE (reloc->r_info) == R_IA64_REL64LSB);
 
Index: sysdeps/m68k/dl-machine.h
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/m68k/dl-machine.h,v
retrieving revision 1.61
diff -u -p -r1.61 dl-machine.h
--- sysdeps/m68k/dl-machine.h 1 Mar 2003 15:33:11 -0000 1.61
+++ sysdeps/m68k/dl-machine.h 26 Jun 2003 08:55:01 -0000
@@ -229,8 +229,9 @@ elf_machine_plt_value (struct link_map *
 static inline void __attribute__ ((always_inline))
 elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
 		  const Elf32_Sym *sym, const struct r_found_version *version,
-		  Elf32_Addr *const reloc_addr)
+		  void *const reloc_addr_arg)
 {
+  Elf32_Addr *const reloc_addr = reloc_addr_arg;
   const unsigned int r_type = ELF32_R_TYPE (reloc->r_info);
 
   if (__builtin_expect (r_type == R_68K_RELATIVE, 0))
@@ -260,8 +261,8 @@ elf_machine_rela (struct link_map *map, 
 				rtld_progname ?: "<program name unknown>",
 				strtab + refsym->st_name);
 	    }
-	  memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
-						   refsym->st_size));
+	  memcpy (reloc_addr_arg, (void *) value,
+		  MIN (sym->st_size, refsym->st_size));
 	  break;
 	case R_68K_GLOB_DAT:
 	case R_68K_JMP_SLOT:
@@ -298,8 +299,9 @@ elf_machine_rela (struct link_map *map, 
 
 static inline void
 elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
-			   Elf32_Addr *const reloc_addr)
+			   void *const reloc_addr_arg)
 {
+  Elf32_Addr *const reloc_addr = reloc_addr_arg;
   *reloc_addr = l_addr + reloc->r_addend;
 }
 
Index: sysdeps/mips/dl-machine.h
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/mips/dl-machine.h,v
retrieving revision 1.68
diff -u -p -r1.68 dl-machine.h
--- sysdeps/mips/dl-machine.h 22 Mar 2003 12:50:46 -0000 1.68
+++ sysdeps/mips/dl-machine.h 26 Jun 2003 08:55:02 -0000
@@ -534,10 +534,7 @@ static inline void
 #endif
 elf_machine_rel (struct link_map *map, const ElfW(Rel) *reloc,
 		 const ElfW(Sym) *sym, const struct r_found_version *version,
-		 /* We use void* because the location to be relocated
-		    is not required to be properly aligned for a
-		    ELFW(Addr).  */
-		 void /* ElfW(Addr) */ *const reloc_addr)
+		 void *const reloc_addr)
 {
   const unsigned long int r_type = ELFW(R_TYPE) (reloc->r_info);
 
@@ -640,7 +637,7 @@ elf_machine_rel (struct link_map *map, c
 
 static inline void
 elf_machine_rel_relative (ElfW(Addr) l_addr, const ElfW(Rel) *reloc,
-			  void /* ElfW(Addr) */ *const reloc_addr)
+			  void *const reloc_addr)
 {
   /* XXX Nothing to do.  There is no relative relocation, right?  */
 }
Index: sysdeps/powerpc/powerpc32/dl-machine.h
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/powerpc/powerpc32/dl-machine.h,v
retrieving revision 1.8
diff -u -p -r1.8 dl-machine.h
--- sysdeps/powerpc/powerpc32/dl-machine.h 16 May 2003 04:16:45 -0000 1.8
+++ sysdeps/powerpc/powerpc32/dl-machine.h 26 Jun 2003 08:55:02 -0000
@@ -356,8 +356,9 @@ extern void _dl_reloc_overflow (struct l
 inline void
 elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
 		  const Elf32_Sym *sym, const struct r_found_version *version,
-		  Elf32_Addr *const reloc_addr)
+		  void *const reloc_addr_arg)
 {
+  Elf32_Addr *const reloc_addr = reloc_addr_arg;
   const Elf32_Sym *const refsym = sym;
   Elf32_Addr value;
   const int r_type = ELF32_R_TYPE (reloc->r_info);
@@ -456,8 +457,9 @@ elf_machine_rela (struct link_map *map, 
 
 static inline void
 elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
-			   Elf32_Addr *const reloc_addr)
+			   void *const reloc_addr_arg)
 {
+  Elf32_Addr *const reloc_addr = reloc_addr_arg;
   *reloc_addr = l_addr + reloc->r_addend;
 }
 
Index: sysdeps/powerpc/powerpc64/dl-machine.h
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/powerpc/powerpc64/dl-machine.h,v
retrieving revision 1.14
diff -u -p -r1.14 dl-machine.h
--- sysdeps/powerpc/powerpc64/dl-machine.h 18 Jun 2003 04:28:45 -0000 1.14
+++ sysdeps/powerpc/powerpc64/dl-machine.h 26 Jun 2003 08:55:02 -0000
@@ -565,8 +565,9 @@ extern void _dl_reloc_overflow (struct l
 
 static inline void
 elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
-			   Elf64_Addr *const reloc_addr)
+			   void *const reloc_addr_arg)
 {
+  Elf64_Addr *const reloc_addr = reloc_addr_arg;
   *reloc_addr = l_addr + reloc->r_addend;
 }
 
@@ -598,8 +599,9 @@ elf_machine_rela (struct link_map *map,
 		  const Elf64_Rela *reloc,
 		  const Elf64_Sym *sym,
 		  const struct r_found_version *version,
-		  Elf64_Addr *const reloc_addr)
+		  void *const reloc_addr_arg)
 {
+  Elf64_Addr *const reloc_addr = reloc_addr_arg;
   const int r_type = ELF64_R_TYPE (reloc->r_info);
 #ifndef RTLD_BOOTSTRAP
   const Elf64_Sym *const refsym = sym;
@@ -766,27 +768,28 @@ elf_machine_rela (struct link_map *map,
                             _dl_argv[0] ?: "<program name unknown>",
 			    strtab + refsym->st_name);
 	}
-      memcpy (reloc_addr, (char *) value, MIN (sym->st_size, refsym->st_size));
+      memcpy (reloc_addr_arg, (char *) value,
+	      MIN (sym->st_size, refsym->st_size));
       return;
 
     case R_PPC64_UADDR64:
       /* We are big-endian.  */
-      ((char *) reloc_addr)[0] = (value >> 56) & 0xff;
-      ((char *) reloc_addr)[1] = (value >> 48) & 0xff;
-      ((char *) reloc_addr)[2] = (value >> 40) & 0xff;
-      ((char *) reloc_addr)[3] = (value >> 32) & 0xff;
-      ((char *) reloc_addr)[4] = (value >> 24) & 0xff;
-      ((char *) reloc_addr)[5] = (value >> 16) & 0xff;
-      ((char *) reloc_addr)[6] = (value >> 8) & 0xff;
-      ((char *) reloc_addr)[7] = (value >> 0) & 0xff;
+      ((char *) reloc_addr_arg)[0] = (value >> 56) & 0xff;
+      ((char *) reloc_addr_arg)[1] = (value >> 48) & 0xff;
+      ((char *) reloc_addr_arg)[2] = (value >> 40) & 0xff;
+      ((char *) reloc_addr_arg)[3] = (value >> 32) & 0xff;
+      ((char *) reloc_addr_arg)[4] = (value >> 24) & 0xff;
+      ((char *) reloc_addr_arg)[5] = (value >> 16) & 0xff;
+      ((char *) reloc_addr_arg)[6] = (value >> 8) & 0xff;
+      ((char *) reloc_addr_arg)[7] = (value >> 0) & 0xff;
       return;
 
     case R_PPC64_UADDR32:
       /* We are big-endian.  */
-      ((char *) reloc_addr)[0] = (value >> 24) & 0xff;
-      ((char *) reloc_addr)[1] = (value >> 16) & 0xff;
-      ((char *) reloc_addr)[2] = (value >> 8) & 0xff;
-      ((char *) reloc_addr)[3] = (value >> 0) & 0xff;
+      ((char *) reloc_addr_arg)[0] = (value >> 24) & 0xff;
+      ((char *) reloc_addr_arg)[1] = (value >> 16) & 0xff;
+      ((char *) reloc_addr_arg)[2] = (value >> 8) & 0xff;
+      ((char *) reloc_addr_arg)[3] = (value >> 0) & 0xff;
       return;
 
     case R_PPC64_ADDR32:
@@ -811,8 +814,8 @@ elf_machine_rela (struct link_map *map,
       if (dont_expect ((value + 0x8000) >= 0x10000))
         _dl_reloc_overflow (map, "R_PPC64_UADDR16", reloc_addr, refsym);
       /* We are big-endian.  */
-      ((char *) reloc_addr)[0] = (value >> 8) & 0xff;
-      ((char *) reloc_addr)[1] = (value >> 0) & 0xff;
+      ((char *) reloc_addr_arg)[0] = (value >> 8) & 0xff;
+      ((char *) reloc_addr_arg)[1] = (value >> 0) & 0xff;
       break;
 
     case R_PPC64_ADDR16_DS:
Index: sysdeps/s390/s390-32/dl-machine.h
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/s390/s390-32/dl-machine.h,v
retrieving revision 1.15
diff -u -p -r1.15 dl-machine.h
--- sysdeps/s390/s390-32/dl-machine.h 24 Apr 2003 17:10:55 -0000 1.15
+++ sysdeps/s390/s390-32/dl-machine.h 26 Jun 2003 08:55:03 -0000
@@ -376,9 +376,10 @@ elf_machine_plt_value (struct link_map *
 
 static inline void
 elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
-		 const Elf32_Sym *sym, const struct r_found_version *version,
-		  Elf32_Addr *const reloc_addr)
+		  const Elf32_Sym *sym, const struct r_found_version *version,
+		  void *const reloc_addr_arg)
 {
+  Elf32_Addr *const reloc_addr = reloc_addr_arg;
   const unsigned int r_type = ELF32_R_TYPE (reloc->r_info);
 
 #if !defined RTLD_BOOTSTRAP || !defined HAVE_Z_COMBRELOC
@@ -486,8 +487,8 @@ elf_machine_rela (struct link_map *map, 
 				rtld_progname ?: "<program name unknown>",
 				strtab + refsym->st_name);
 	    }
-	  memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
-						   refsym->st_size));
+	  memcpy (reloc_addr_arg, (void *) value,
+		  MIN (sym->st_size, refsym->st_size));
 	  break;
 # endif
 	case R_390_32:
@@ -529,8 +530,9 @@ elf_machine_rela (struct link_map *map, 
 
 static inline void
 elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
-			   Elf32_Addr *const reloc_addr)
+			   void *const reloc_addr_arg)
 {
+  Elf32_Addr *const reloc_addr = reloc_addr_arg;
   *reloc_addr = l_addr + reloc->r_addend;
 }
 
Index: sysdeps/s390/s390-64/dl-machine.h
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/s390/s390-64/dl-machine.h,v
retrieving revision 1.14
diff -u -p -r1.14 dl-machine.h
--- sysdeps/s390/s390-64/dl-machine.h 24 Apr 2003 17:10:55 -0000 1.14
+++ sysdeps/s390/s390-64/dl-machine.h 26 Jun 2003 08:55:03 -0000
@@ -344,9 +344,10 @@ elf_machine_plt_value (struct link_map *
 
 static inline void
 elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
-		 const Elf64_Sym *sym, const struct r_found_version *version,
-		  Elf64_Addr *const reloc_addr)
+		  const Elf64_Sym *sym, const struct r_found_version *version,
+		  void *const reloc_addr_arg)
 {
+  Elf64_Addr *const reloc_addr = reloc_addr_arg;
   const unsigned int r_type = ELF64_R_TYPE (reloc->r_info);
 
 #if !defined RTLD_BOOTSTRAP || !defined HAVE_Z_COMBRELOC
@@ -454,8 +455,8 @@ elf_machine_rela (struct link_map *map, 
 				rtld_progname ?: "<program name unknown>",
 				strtab + refsym->st_name);
 	    }
-	  memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
-						   refsym->st_size));
+	  memcpy (reloc_addr_arg, (void *) value,
+		  MIN (sym->st_size, refsym->st_size));
 	  break;
 # endif
 	case R_390_64:
@@ -509,8 +510,9 @@ elf_machine_rela (struct link_map *map, 
 
 static inline void
 elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
-			   Elf64_Addr *const reloc_addr)
+			   void *const reloc_addr_arg)
 {
+  Elf64_Addr *const reloc_addr = reloc_addr_arg;
   *reloc_addr = l_addr + reloc->r_addend;
 }
 
Index: sysdeps/sh/dl-machine.h
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/sh/dl-machine.h,v
retrieving revision 1.27
diff -u -p -r1.27 dl-machine.h
--- sysdeps/sh/dl-machine.h 12 Jan 2003 08:50:51 -0000 1.27
+++ sysdeps/sh/dl-machine.h 26 Jun 2003 08:55:03 -0000
@@ -456,15 +456,16 @@ elf_machine_plt_value (struct link_map *
 
 static inline void
 elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
-		 const Elf32_Sym *sym, const struct r_found_version *version,
-		 Elf32_Addr *const reloc_addr)
+		  const Elf32_Sym *sym, const struct r_found_version *version,
+		  void *const reloc_addr_arg)
 {
+  Elf32_Addr *const reloc_addr = reloc_addr_arg;
   const unsigned int r_type = ELF32_R_TYPE (reloc->r_info);
   Elf32_Addr value;
 
-#define COPY_UNALIGNED_WORD(sw, tw, align) \
+#define COPY_UNALIGNED_WORD(swp, twp, align) \
   { \
-    void *__s = &(sw), *__t = &(tw); \
+    void *__s = (swp), *__t = (twp); \
     switch ((align)) \
     { \
     case 0: \
@@ -493,10 +494,12 @@ elf_machine_rela (struct link_map *map, 
 	    value = map->l_addr + reloc->r_addend;
 	  else
 	    {
-	      COPY_UNALIGNED_WORD (*reloc_addr, value, (int) reloc_addr & 3);
+	      COPY_UNALIGNED_WORD (reloc_addr_arg, &value,
+				   (int) reloc_addr_arg & 3);
 	      value += map->l_addr;
 	    }
-	  COPY_UNALIGNED_WORD (value, *reloc_addr, (int) reloc_addr & 3);
+	  COPY_UNALIGNED_WORD (&value, reloc_addr_arg,
+			       (int) reloc_addr_arg & 3);
 	}
     }
 #ifndef RTLD_BOOTSTRAP
@@ -538,8 +541,8 @@ elf_machine_rela (struct link_map *map, 
 				rtld_progname ?: "<program name unknown>",
 				strtab + refsym->st_name);
 	    }
-	  memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
-						   refsym->st_size));
+	  memcpy (reloc_addr_arg, (void *) value,
+		  MIN (sym->st_size, refsym->st_size));
 	  break;
 	case R_SH_GLOB_DAT:
 	case R_SH_JMP_SLOT:
@@ -606,12 +609,14 @@ elf_machine_rela (struct link_map *map, 
 		 used while loading those libraries.  */
 	      value -= map->l_addr + refsym->st_value + reloc->r_addend;
 #endif
-	    COPY_UNALIGNED_WORD (value, *reloc_addr, (int) reloc_addr & 3);
+	    COPY_UNALIGNED_WORD (&value, reloc_addr_arg,
+				 (int) reloc_addr_arg & 3);
 	    break;
 	  }
 	case R_SH_REL32:
 	  value = (value - (Elf32_Addr) reloc_addr);
-	  COPY_UNALIGNED_WORD (value, *reloc_addr, (int) reloc_addr & 3);
+	  COPY_UNALIGNED_WORD (&value, reloc_addr_arg,
+			       (int) reloc_addr_arg & 3);
 	  break;
 	default:
 	  _dl_reloc_bad_type (map, r_type, 0);
@@ -622,18 +627,19 @@ elf_machine_rela (struct link_map *map, 
 
 static inline void
 elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
-			   Elf32_Addr *const reloc_addr)
+			   void *const reloc_addr_arg)
 {
+  Elf32_Addr *const reloc_addr = reloc_addr_arg;
   Elf32_Addr value;
 
   if (reloc->r_addend)
     value = l_addr + reloc->r_addend;
   else
     {
-      COPY_UNALIGNED_WORD (*reloc_addr, value, (int) reloc_addr & 3);
+      COPY_UNALIGNED_WORD (reloc_addr_arg, &value, (int) reloc_addr_arg & 3);
       value += l_addr;
     }
-  COPY_UNALIGNED_WORD (value, *reloc_addr, (int) reloc_addr & 3);
+  COPY_UNALIGNED_WORD (&value, reloc_addr_arg, (int) reloc_addr_arg & 3);
 
 #undef COPY_UNALIGNED_WORD
 }
Index: sysdeps/sparc/sparc32/dl-machine.h
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/sparc/sparc32/dl-machine.h,v
retrieving revision 1.45
diff -u -p -r1.45 dl-machine.h
--- sysdeps/sparc/sparc32/dl-machine.h 27 Jan 2003 20:50:57 -0000 1.45
+++ sysdeps/sparc/sparc32/dl-machine.h 26 Jun 2003 08:55:03 -0000
@@ -435,8 +435,9 @@ elf_machine_plt_value (struct link_map *
 static inline void
 elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
 		  const Elf32_Sym *sym, const struct r_found_version *version,
-		  Elf32_Addr *const reloc_addr)
+		  void *const reloc_addr_arg)
 {
+  Elf32_Addr *const reloc_addr = reloc_addr_arg;
   const unsigned int r_type = ELF32_R_TYPE (reloc->r_info);
 
 #if !defined RTLD_BOOTSTRAP && !defined HAVE_Z_COMBRELOC
@@ -510,8 +511,8 @@ elf_machine_rela (struct link_map *map, 
 				rtld_progname ?: "<program name unknown>",
 				strtab + refsym->st_name);
 	    }
-	  memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
-						   refsym->st_size));
+	  memcpy (reloc_addr_arg, (void *) value,
+		  MIN (sym->st_size, refsym->st_size));
 	  break;
 #endif
 	case R_SPARC_GLOB_DAT:
@@ -587,14 +588,14 @@ elf_machine_rela (struct link_map *map, 
 	  *reloc_addr = (*reloc_addr & 0xffc00000) | (value >> 10);
 	  break;
 	case R_SPARC_UA16:
-	  ((unsigned char *) reloc_addr) [0] = value >> 8;
-	  ((unsigned char *) reloc_addr) [1] = value;
+	  ((unsigned char *) reloc_addr_arg) [0] = value >> 8;
+	  ((unsigned char *) reloc_addr_arg) [1] = value;
 	  break;
 	case R_SPARC_UA32:
-	  ((unsigned char *) reloc_addr) [0] = value >> 24;
-	  ((unsigned char *) reloc_addr) [1] = value >> 16;
-	  ((unsigned char *) reloc_addr) [2] = value >> 8;
-	  ((unsigned char *) reloc_addr) [3] = value;
+	  ((unsigned char *) reloc_addr_arg) [0] = value >> 24;
+	  ((unsigned char *) reloc_addr_arg) [1] = value >> 16;
+	  ((unsigned char *) reloc_addr_arg) [2] = value >> 8;
+	  ((unsigned char *) reloc_addr_arg) [3] = value;
 	  break;
 #endif
 	case R_SPARC_NONE:		/* Alright, Wilbur.  */
@@ -610,8 +611,9 @@ elf_machine_rela (struct link_map *map, 
 
 static inline void
 elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
-			   Elf32_Addr *const reloc_addr)
+			   void *const reloc_addr_arg)
 {
+  Elf32_Addr *const reloc_addr = reloc_addr_arg;
   *reloc_addr += l_addr + reloc->r_addend;
 }
 
Index: sysdeps/sparc/sparc64/dl-machine.h
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/sparc/sparc64/dl-machine.h,v
retrieving revision 1.42
diff -u -p -r1.42 dl-machine.h
--- sysdeps/sparc/sparc64/dl-machine.h 27 Sep 2002 03:23:44 -0000 1.42
+++ sysdeps/sparc/sparc64/dl-machine.h 26 Jun 2003 08:55:04 -0000
@@ -1,5 +1,6 @@
 /* Machine-dependent ELF dynamic relocation inline functions.  Sparc64 version.
-   Copyright (C) 1997,1998,1999,2000,2001,2002 Free Software Foundation, Inc.
+   Copyright (C) 1997,1998,1999,2000,2001,2002, 2003
+	Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -240,8 +241,9 @@ elf_machine_plt_value (struct link_map *
 static inline void
 elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
 		  const Elf64_Sym *sym, const struct r_found_version *version,
-		  Elf64_Addr *const reloc_addr)
+		  void *const reloc_addr_arg)
 {
+  Elf64_Addr *const reloc_addr = reloc_addr_arg;
   const unsigned long int r_type = ELF64_R_TYPE_ID (reloc->r_info);
 
 #if !defined RTLD_BOOTSTRAP || !defined HAVE_Z_COMBRELOC
@@ -292,8 +294,8 @@ elf_machine_rela (struct link_map *map, 
 				rtld_progname ?: "<program name unknown>",
 				strtab + refsym->st_name);
 	    }
-	  memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
-						   refsym->st_size));
+	  memcpy (reloc_addr_arg, (void *) value,
+		  MIN (sym->st_size, refsym->st_size));
 	  break;
 #endif
 	case R_SPARC_64:
@@ -392,31 +394,31 @@ elf_machine_rela (struct link_map *map, 
 	  break;
 #ifndef RTLD_BOOTSTRAP
 	case R_SPARC_UA16:
-	  ((unsigned char *) reloc_addr) [0] = value >> 8;
-	  ((unsigned char *) reloc_addr) [1] = value;
+	  ((unsigned char *) reloc_addr_arg) [0] = value >> 8;
+	  ((unsigned char *) reloc_addr_arg) [1] = value;
 	  break;
 	case R_SPARC_UA32:
-	  ((unsigned char *) reloc_addr) [0] = value >> 24;
-	  ((unsigned char *) reloc_addr) [1] = value >> 16;
-	  ((unsigned char *) reloc_addr) [2] = value >> 8;
-	  ((unsigned char *) reloc_addr) [3] = value;
+	  ((unsigned char *) reloc_addr_arg) [0] = value >> 24;
+	  ((unsigned char *) reloc_addr_arg) [1] = value >> 16;
+	  ((unsigned char *) reloc_addr_arg) [2] = value >> 8;
+	  ((unsigned char *) reloc_addr_arg) [3] = value;
 	  break;
 	case R_SPARC_UA64:
-	  if (! ((long) reloc_addr & 3))
+	  if (! ((long) reloc_addr_arg & 3))
 	    {
 	      /* Common in .eh_frame */
-	      ((unsigned int *) reloc_addr) [0] = value >> 32;
-	      ((unsigned int *) reloc_addr) [1] = value;
+	      ((unsigned int *) reloc_addr_arg) [0] = value >> 32;
+	      ((unsigned int *) reloc_addr_arg) [1] = value;
 	      break;
 	    }
-	  ((unsigned char *) reloc_addr) [0] = value >> 56;
-	  ((unsigned char *) reloc_addr) [1] = value >> 48;
-	  ((unsigned char *) reloc_addr) [2] = value >> 40;
-	  ((unsigned char *) reloc_addr) [3] = value >> 32;
-	  ((unsigned char *) reloc_addr) [4] = value >> 24;
-	  ((unsigned char *) reloc_addr) [5] = value >> 16;
-	  ((unsigned char *) reloc_addr) [6] = value >> 8;
-	  ((unsigned char *) reloc_addr) [7] = value;
+	  ((unsigned char *) reloc_addr_arg) [0] = value >> 56;
+	  ((unsigned char *) reloc_addr_arg) [1] = value >> 48;
+	  ((unsigned char *) reloc_addr_arg) [2] = value >> 40;
+	  ((unsigned char *) reloc_addr_arg) [3] = value >> 32;
+	  ((unsigned char *) reloc_addr_arg) [4] = value >> 24;
+	  ((unsigned char *) reloc_addr_arg) [5] = value >> 16;
+	  ((unsigned char *) reloc_addr_arg) [6] = value >> 8;
+	  ((unsigned char *) reloc_addr_arg) [7] = value;
 	  break;
 #endif
 #if !defined RTLD_BOOTSTRAP || defined _NDEBUG
@@ -430,8 +432,9 @@ elf_machine_rela (struct link_map *map, 
 
 static inline void
 elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
-			   Elf64_Addr *const reloc_addr)
+			   void *const reloc_addr_arg)
 {
+  Elf64_Addr *const reloc_addr = reloc_addr_arg;
   *reloc_addr = l_addr + reloc->r_addend;
 }
 
Index: sysdeps/x86_64/dl-machine.h
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/x86_64/dl-machine.h,v
retrieving revision 1.20
diff -u -p -r1.20 dl-machine.h
--- sysdeps/x86_64/dl-machine.h 18 Jun 2003 18:31:32 -0000 1.20
+++ sysdeps/x86_64/dl-machine.h 26 Jun 2003 08:55:04 -0000
@@ -361,9 +361,10 @@ elf_machine_plt_value (struct link_map *
 
 static inline void
 elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
-		 const Elf64_Sym *sym, const struct r_found_version *version,
-		 Elf64_Addr *const reloc_addr)
+		  const Elf64_Sym *sym, const struct r_found_version *version,
+		  void *const reloc_addr_arg)
 {
+  Elf64_Addr *const reloc_addr = reloc_addr_arg;
   const unsigned long int r_type = ELF64_R_TYPE (reloc->r_info);
 
 #if !defined RTLD_BOOTSTRAP || !defined HAVE_Z_COMBRELOC
@@ -510,8 +511,8 @@ elf_machine_rela (struct link_map *map, 
 				rtld_progname ?: "<program name unknown>",
 				strtab + refsym->st_name);
 	    }
-	  memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
-						   refsym->st_size));
+	  memcpy (reloc_addr_arg, (void *) value,
+		  MIN (sym->st_size, refsym->st_size));
 	  break;
 # endif
 	default:
@@ -525,8 +526,9 @@ elf_machine_rela (struct link_map *map, 
 
 static inline void
 elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
-			   Elf64_Addr *const reloc_addr)
+			   void *const reloc_addr_arg)
 {
+  Elf64_Addr *const reloc_addr = reloc_addr_arg;
   assert (ELF64_R_TYPE (reloc->r_info) == R_X86_64_RELATIVE);
   *reloc_addr = l_addr + reloc->r_addend;
 }

-- 
Alexandre Oliva   Enjoy Guarana', see http://www.ic.unicamp.br/~oliva/
Red Hat GCC Developer                 aoliva@{redhat.com, gcc.gnu.org}
CS PhD student at IC-Unicamp        oliva@{lsd.ic.unicamp.br, gnu.org}
Free Software Evangelist                Professional serial bug killer

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]