1998-08-28 22:49  Ulrich Drepper  <drepper@cygnus.com>

	* elf/do-rel.h (elf_dynamic_do_rel): Call elf_machine_lazy_rel
	with load address, not map address.
	* sysdeps/alpha/dl-machine.h (elf_machine_lazy_rel): Change first
	parameter and use this value.
	* sysdeps/arm/dl-machine.h: Likewise.
	* sysdeps/i386/dl-machine.h: Likewise.
	* sysdeps/m68k/dl-machine.h: Likewise.
	* sysdeps/mips/dl-machine.h (elf_machine_lazy_rel): Change first
	parameter.
	* sysdeps/powerpc/dl-machine.h: Likewise
	* sysdeps/sparc/sparc32/dl-machine.h: Likewise
	* sysdeps/sparc/sparc64/dl-machine.h: Likewise
This commit is contained in:
Ulrich Drepper 1998-08-28 22:54:57 +00:00
parent 75311719d3
commit b0cf070b98
10 changed files with 44 additions and 32 deletions

View File

@ -1,3 +1,18 @@
1998-08-28 22:49 Ulrich Drepper <drepper@cygnus.com>
* elf/do-rel.h (elf_dynamic_do_rel): Call elf_machine_lazy_rel
with load address, not map address.
* sysdeps/alpha/dl-machine.h (elf_machine_lazy_rel): Change first
parameter and use this value.
* sysdeps/arm/dl-machine.h: Likewise.
* sysdeps/i386/dl-machine.h: Likewise.
* sysdeps/m68k/dl-machine.h: Likewise.
* sysdeps/mips/dl-machine.h (elf_machine_lazy_rel): Change first
parameter.
* sysdeps/powerpc/dl-machine.h: Likewise
* sysdeps/sparc/sparc32/dl-machine.h: Likewise
* sysdeps/sparc/sparc64/dl-machine.h: Likewise
1998-08-28 09:22 Ulrich Drepper <drepper@cygnus.com>
* elf/rtld.c (process_envvars): Fix copy&paste error.

View File

@ -1,5 +1,5 @@
/* Do relocations for ELF dynamic linking.
Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
Copyright (C) 1995, 1996, 1997, 1998 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
@ -44,9 +44,12 @@ elf_dynamic_do_rel (struct link_map *map,
const ElfW(Rel) *end = (const ElfW(Rel) *)(map->l_addr + reladdr + relsize);
if (lazy)
/* Doing lazy PLT relocations; they need very little info. */
for (; r < end; ++r)
elf_machine_lazy_rel (map, r);
{
/* Doing lazy PLT relocations; they need very little info. */
ElfW(Addr) l_addr = map->l_addr;
for (; r < end; ++r)
elf_machine_lazy_rel (l_addr, r);
}
else
{
const ElfW(Sym) *const symtab =

View File

@ -448,16 +448,16 @@ elf_machine_rela (struct link_map *map,
}
static inline void
elf_machine_lazy_rel (struct link_map *map, const Elf64_Rela *reloc)
elf_machine_lazy_rel (Elf64_Addr l_addr, const Elf64_Rela *reloc)
{
Elf64_Addr * const reloc_addr = (void *)(map->l_addr + reloc->r_offset);
Elf64_Addr * const reloc_addr = (void *)(l_addr + reloc->r_offset);
unsigned long const r_type = ELF64_R_TYPE (reloc->r_info);
if (r_type == R_ALPHA_JMP_SLOT)
{
/* Perform a RELATIVE reloc on the .got entry that transfers
to the .plt. */
*reloc_addr += map->l_addr;
*reloc_addr += l_addr;
}
else if (r_type == R_ALPHA_NONE)
return;

View File

@ -166,7 +166,7 @@ _dl_runtime_resolve:
mov pc, ip
.size _dl_runtime_resolve, .-_dl_runtime_resolve
.globl _dl_runtime_profile
.type _dl_runtime_profile, #function
.align 2
@ -449,13 +449,13 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
}
static inline void
elf_machine_lazy_rel (struct link_map *map, const Elf32_Rel *reloc)
elf_machine_lazy_rel (Elf32_Addr l_addr, const Elf32_Rel *reloc)
{
Elf32_Addr *const reloc_addr = (void *) (map->l_addr + reloc->r_offset);
Elf32_Addr *const reloc_addr = (void *) (l_addr + reloc->r_offset);
switch (ELF32_R_TYPE (reloc->r_info))
{
case R_ARM_JUMP_SLOT:
*reloc_addr += map->l_addr;
*reloc_addr += l_addr;
break;
default:
assert (! "unexpected PLT reloc type");

View File

@ -384,18 +384,12 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
}
static inline void
elf_machine_lazy_rel (struct link_map *map, const Elf32_Rel *reloc)
elf_machine_lazy_rel (Elf32_Addr l_addr, const Elf32_Rel *reloc)
{
Elf32_Addr *const reloc_addr = (void *) (map->l_addr + reloc->r_offset);
switch (ELF32_R_TYPE (reloc->r_info))
{
case R_386_JMP_SLOT:
*reloc_addr += map->l_addr;
break;
default:
assert (! "unexpected PLT reloc type");
break;
}
Elf32_Addr *const reloc_addr = (void *) (l_addr + reloc->r_offset);
/* Check for unexpected PLT reloc type. */
assert (ELF32_R_TYPE (reloc->r_info) == R_386_JMP_SLOT);
*reloc_addr += l_addr;
}
#endif /* RESOLVE */

View File

@ -320,13 +320,13 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
}
static inline void
elf_machine_lazy_rel (struct link_map *map, const Elf32_Rela *reloc)
elf_machine_lazy_rel (Elf32_Addr l_addr, const Elf32_Rela *reloc)
{
Elf32_Addr *const reloc_addr = (void *) (map->l_addr + reloc->r_offset);
Elf32_Addr *const reloc_addr = (void *) (l_addr + reloc->r_offset);
switch (ELF32_R_TYPE (reloc->r_info))
{
case R_68K_JMP_SLOT:
*reloc_addr += map->l_addr;
*reloc_addr += l_addr;
break;
default:
assert (! "unexpected PLT reloc type");

View File

@ -1,5 +1,5 @@
/* Machine-dependent ELF dynamic relocation inline functions. MIPS version.
Copyright (C) 1996, 1997 Free Software Foundation, Inc.
Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Kazumoto Kojima <kkojima@info.kanagawa-u.ac.jp>.
@ -582,7 +582,7 @@ elf_machine_rel (struct link_map *map, const ElfW(Rel) *reloc,
}
static inline void
elf_machine_lazy_rel (struct link_map *map, const ElfW(Rel) *reloc)
elf_machine_lazy_rel (Elf32_addr l_addr, const ElfW(Rel) *reloc)
{
/* Do nothing. */
}

View File

@ -1,5 +1,5 @@
/* Machine-dependent ELF dynamic relocation inline functions. PowerPC version.
Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
Copyright (C) 1995, 1996, 1997, 1998 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
@ -543,7 +543,7 @@ elf_machine_runtime_setup (struct link_map *map, int lazy, int profile)
}
static inline void
elf_machine_lazy_rel (struct link_map *map, const Elf32_Rela *reloc)
elf_machine_lazy_rel (Elf32_Addr l_addr, const Elf32_Rela *reloc)
{
/* elf_machine_runtime_setup handles this. */
}

View File

@ -403,7 +403,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
}
static inline void
elf_machine_lazy_rel (struct link_map *map, const Elf32_Rela *reloc)
elf_machine_lazy_rel (Elf32_Addr l_addr, const Elf32_Rela *reloc)
{
switch (ELF32_R_TYPE (reloc->r_info))
{

View File

@ -1,5 +1,5 @@
/* Machine-dependent ELF dynamic relocation inline functions. Sparc64 version.
Copyright (C) 1997 Free Software Foundation, Inc.
Copyright (C) 1997, 1998 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
@ -200,7 +200,7 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
}
static inline void
elf_machine_lazy_rel (struct link_map *map, const Elf64_Rela *reloc)
elf_machine_lazy_rel (Elf64_Addr l_addr, const Elf64_Rela *reloc)
{
switch (ELF64_R_TYPE (reloc->r_info))
{