* 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.

2003-07-31  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.
This commit is contained in:
Alexandre Oliva 2003-07-31 06:33:53 +00:00
parent e4a6507c4c
commit 87d254a7bf
18 changed files with 218 additions and 136 deletions

View File

@ -1,3 +1,41 @@
2003-07-31 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.
2003-07-29 Ulrich Drepper <drepper@redhat.com>
* sysdeps/generic/dl-tls.c (_dl_determine_tlsoffset): Restore

View File

@ -21,20 +21,30 @@
#include <assert.h>
#ifdef RESOLVE
/* We pass reloc_addr as a pointer to void, as opposed to a pointer to
ElfW(Addr), because not all architectures can assume that the
relocated address is properly aligned, whereas the compiler is
entitled to assume that a pointer to a type is properly aligned for
the type. Even if we cast the pointer back to some other type with
less strict alignment requirements, the compiler might still
remember that the pointer was originally more aligned, thereby
optimizing away alignment tests or using word instructions for
copying memory, breaking the very code written to handle the
unaligned cases. */
auto void __attribute__((always_inline))
elf_machine_rel (struct link_map *map, const ElfW(Rel) *reloc,
const ElfW(Sym) *sym, const struct r_found_version *version,
ElfW(Addr) *const reloc_addr);
void *const reloc_addr);
auto void __attribute__((always_inline))
elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
const ElfW(Sym) *sym, const struct r_found_version *version,
ElfW(Addr) *const reloc_addr);
void *const reloc_addr);
auto void __attribute__((always_inline))
elf_machine_rel_relative (ElfW(Addr) l_addr, const ElfW(Rel) *reloc,
ElfW(Addr) *const reloc_addr);
void *const reloc_addr);
auto void __attribute__((always_inline))
elf_machine_rela_relative (ElfW(Addr) l_addr, const ElfW(Rela) *reloc,
ElfW(Addr) *const reloc_addr);
void *const reloc_addr);
# if ELF_MACHINE_NO_RELA || defined ELF_MACHINE_PLT_REL
auto void __attribute__((always_inline))
elf_machine_lazy_rel (struct link_map *map,

View File

@ -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

View File

@ -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_addr, Elf32_Addr value)
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, const Elf32_Rel *reloc,
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, const Elf32_Rel *reloc,
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, const Elf32_Rela *reloc,
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, const Elf32_Rela *reloc,
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

View File

@ -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 *map, const Elf32_Rela *reloc,
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, const Elf32_Rela *reloc,
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, const Elf32_Rela *reloc,
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;
}

View File

@ -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, const Elf32_Rela *reloc,
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, const Elf32_Rela *reloc,
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, const Elf32_Rela *reloc,
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_map *map, Elf32_Addr l_addr,
{
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;

View File

@ -391,8 +391,9 @@ elf_machine_plt_value (struct link_map *map, const Elf32_Rel *reloc,
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, const Elf32_Rel *reloc,
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, const Elf32_Rel *reloc,
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, const Elf32_Rela *reloc,
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, const Elf32_Rela *reloc,
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_addr, const Elf32_Rel *reloc,
#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 */

View File

@ -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);

View File

@ -229,8 +229,9 @@ elf_machine_plt_value (struct link_map *map, const Elf32_Rela *reloc,
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, const Elf32_Rela *reloc,
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, const Elf32_Rela *reloc,
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;
}

View File

@ -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, const ElfW(Rel) *reloc,
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? */
}

View File

@ -356,8 +356,9 @@ extern void _dl_reloc_overflow (struct link_map *map,
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, const Elf32_Rela *reloc,
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;
}

View File

@ -565,8 +565,9 @@ extern void _dl_reloc_overflow (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;
}
@ -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:

View File

@ -376,9 +376,10 @@ elf_machine_plt_value (struct link_map *map, const Elf32_Rela *reloc,
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, const Elf32_Rela *reloc,
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, const Elf32_Rela *reloc,
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;
}

View File

@ -344,9 +344,10 @@ elf_machine_plt_value (struct link_map *map, const Elf64_Rela *reloc,
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, const Elf64_Rela *reloc,
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, const Elf64_Rela *reloc,
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;
}

View File

@ -456,15 +456,16 @@ elf_machine_plt_value (struct link_map *map, const Elf32_Rela *reloc,
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, const Elf32_Rela *reloc,
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, const Elf32_Rela *reloc,
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, const Elf32_Rela *reloc,
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, const Elf32_Rela *reloc,
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
}

View File

@ -435,8 +435,9 @@ elf_machine_plt_value (struct link_map *map, const Elf32_Rela *reloc,
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, const Elf32_Rela *reloc,
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, const Elf32_Rela *reloc,
*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, const Elf32_Rela *reloc,
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;
}

View File

@ -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 *map, const Elf64_Rela *reloc,
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, const Elf64_Rela *reloc,
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, const Elf64_Rela *reloc,
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, const Elf64_Rela *reloc,
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;
}

View File

@ -361,9 +361,10 @@ elf_machine_plt_value (struct link_map *map, const Elf64_Rela *reloc,
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, const Elf64_Rela *reloc,
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, const Elf64_Rela *reloc,
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;
}