1999-07-21 Roland McGrath <roland@baalperazim.frob.com>

* elf/dl-reloc.c (_dl_reloc_bad_type): New function.
	* elf/ldsodefs.h: Declare it.
	* sysdeps/sparc/sparc64/dl-machine.h (elf_machine_rela): Use it
	instead of assert.
	(elf_machine_lazy_rel): Likewise.  Take new arg MAP.
	* sysdeps/sparc/sparc32/dl-machine.h (elf_machine_rela): Likewise.
	(elf_machine_lazy_rel): Likewise.
	* sysdeps/mips/dl-machine.h (elf_machine_rel): Likewise.
	(elf_machine_lazy_rel): Likewise.
	* sysdeps/mips/mips64/dl-machine.h (elf_machine_rel): Likewise.
	(elf_machine_lazy_rel): Likewise.
	* sysdeps/m68k/dl-machine.h (elf_machine_rela): Likewise.
	(elf_machine_lazy_rel): Likewise.
	* sysdeps/i386/dl-machine.h (elf_machine_rel): Likewise.
	(elf_machine_lazy_rel): Likewise.
	* sysdeps/generic/dl-machine.h (elf_machine_rel): Likewise.
	* sysdeps/arm/dl-machine.h (elf_machine_rel): Likewise.
	(elf_machine_lazy_rel): Likewise.
	* sysdeps/alpha/dl-machine.h (elf_machine_rela): Likewise.
	(elf_machine_lazy_rel): Likewise.
	* sysdeps/powerpc/dl-machine.h (elf_machine_lazy_rel): Likewise.
	* sysdeps/powerpc/dl-machine.c (__process_machine_rela): Use
	_dl_reloc_bad_type instead of _dl_signal_error.
	* elf/do-rel.h (elf_dynamic_do_rel): Pass MAP to elf_machine_lazy_rel.
This commit is contained in:
Roland McGrath 1999-07-21 16:58:06 +00:00
parent e26996aa99
commit 421c80d27e
15 changed files with 104 additions and 44 deletions

View File

@ -1,3 +1,30 @@
1999-07-21 Roland McGrath <roland@baalperazim.frob.com>
* elf/dl-reloc.c (_dl_reloc_bad_type): New function.
* elf/ldsodefs.h: Declare it.
* sysdeps/sparc/sparc64/dl-machine.h (elf_machine_rela): Use it
instead of assert.
(elf_machine_lazy_rel): Likewise. Take new arg MAP.
* sysdeps/sparc/sparc32/dl-machine.h (elf_machine_rela): Likewise.
(elf_machine_lazy_rel): Likewise.
* sysdeps/mips/dl-machine.h (elf_machine_rel): Likewise.
(elf_machine_lazy_rel): Likewise.
* sysdeps/mips/mips64/dl-machine.h (elf_machine_rel): Likewise.
(elf_machine_lazy_rel): Likewise.
* sysdeps/m68k/dl-machine.h (elf_machine_rela): Likewise.
(elf_machine_lazy_rel): Likewise.
* sysdeps/i386/dl-machine.h (elf_machine_rel): Likewise.
(elf_machine_lazy_rel): Likewise.
* sysdeps/generic/dl-machine.h (elf_machine_rel): Likewise.
* sysdeps/arm/dl-machine.h (elf_machine_rel): Likewise.
(elf_machine_lazy_rel): Likewise.
* sysdeps/alpha/dl-machine.h (elf_machine_rela): Likewise.
(elf_machine_lazy_rel): Likewise.
* sysdeps/powerpc/dl-machine.h (elf_machine_lazy_rel): Likewise.
* sysdeps/powerpc/dl-machine.c (__process_machine_rela): Use
_dl_reloc_bad_type instead of _dl_signal_error.
* elf/do-rel.h (elf_dynamic_do_rel): Pass MAP to elf_machine_lazy_rel.
1999-07-20 Mark Kettenis <kettenis@gnu.org> 1999-07-20 Mark Kettenis <kettenis@gnu.org>
* sysdeps/mach/_strerror.c: Include <libintl.h>. * sysdeps/mach/_strerror.c: Include <libintl.h>.

View File

@ -129,3 +129,27 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[],
} }
} }
} }
#include "../stdio-common/_itoa.h"
#define DIGIT(b) _itoa_lower_digits[(b) & 0xf];
void
internal_function
_dl_reloc_bad_type (struct link_map *map, uint_fast8_t type, int plt)
{
extern const char _itoa_lower_digits[];
if (plt)
{
char msg[] = "unexpected reloc type 0x??";
msg[sizeof msg - 2] = DIGIT(type >> 8);
msg[sizeof msg - 1] = DIGIT(type);
_dl_signal_error (0, map->l_name, msg);
}
else
{
char msg[] = "unexpected PLT reloc type 0x??";
msg[sizeof msg - 2] = DIGIT(type >> 8);
msg[sizeof msg - 1] = DIGIT(type);
_dl_signal_error (0, map->l_name, msg);
}
}

View File

@ -48,7 +48,7 @@ elf_dynamic_do_rel (struct link_map *map,
/* Doing lazy PLT relocations; they need very little info. */ /* Doing lazy PLT relocations; they need very little info. */
ElfW(Addr) l_addr = map->l_addr; ElfW(Addr) l_addr = map->l_addr;
for (; r < end; ++r) for (; r < end; ++r)
elf_machine_lazy_rel (l_addr, r); elf_machine_lazy_rel (map, l_addr, r);
} }
else else
{ {

View File

@ -326,6 +326,13 @@ extern void _dl_relocate_object (struct link_map *map,
struct r_scope_elem *scope[], struct r_scope_elem *scope[],
int lazy, int consider_profiling); int lazy, int consider_profiling);
/* Call _dl_signal_error with a message about an unhandled reloc type.
TYPE is the result of ELFW(R_TYPE) (r_info), i.e. an R_<CPU>_* value.
PLT is nonzero if this was a PLT reloc; it just affects the message. */
extern void _dl_reloc_bad_type (struct link_map *map,
uint_fast8_t type, int plt)
internal_function;
/* Check the version dependencies of all objects available through /* Check the version dependencies of all objects available through
MAP. If VERBOSE print some more diagnostics. */ MAP. If VERBOSE print some more diagnostics. */
extern int _dl_check_all_versions (struct link_map *map, int verbose) extern int _dl_check_all_versions (struct link_map *map, int verbose)

View File

@ -26,7 +26,6 @@
#define ELF_MACHINE_NAME "alpha" #define ELF_MACHINE_NAME "alpha"
#include <assert.h>
#include <string.h> #include <string.h>
@ -490,12 +489,13 @@ elf_machine_rela (struct link_map *map,
*reloc_addr = sym_value; *reloc_addr = sym_value;
} }
else else
assert (! "unexpected dynamic reloc type"); _dl_reloc_bad_type (map, r_type, 0);
} }
} }
static inline void static inline void
elf_machine_lazy_rel (Elf64_Addr l_addr, const Elf64_Rela *reloc) elf_machine_lazy_rel (struct link_map *map,
Elf64_Addr l_addr, const Elf64_Rela *reloc)
{ {
Elf64_Addr * const reloc_addr = (void *)(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); unsigned long const r_type = ELF64_R_TYPE (reloc->r_info);
@ -509,7 +509,7 @@ elf_machine_lazy_rel (Elf64_Addr l_addr, const Elf64_Rela *reloc)
else if (r_type == R_ALPHA_NONE) else if (r_type == R_ALPHA_NONE)
return; return;
else else
assert (! "unexpected PLT reloc type"); _dl_reloc_bad_type (map, r_type, 1);
} }
#endif /* RESOLVE */ #endif /* RESOLVE */

View File

@ -24,8 +24,6 @@
#include <sys/param.h> #include <sys/param.h>
#include <assert.h>
/* Return nonzero iff E_MACHINE is compatible with the running host. */ /* Return nonzero iff E_MACHINE is compatible with the running host. */
static inline int __attribute__ ((unused)) static inline int __attribute__ ((unused))
elf_machine_matches_host (Elf32_Half e_machine) elf_machine_matches_host (Elf32_Half e_machine)
@ -438,19 +436,22 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
break; break;
} }
default: default:
assert (! "unexpected dynamic reloc type"); _dl_reloc_bad_type (map, ELF32_R_TYPE (reloc->r_info), 0);
break; break;
} }
} }
} }
static inline void static inline void
elf_machine_lazy_rel (Elf32_Addr l_addr, const Elf32_Rel *reloc) elf_machine_lazy_rel (struct link_map *map,
Elf32_Addr l_addr, const Elf32_Rel *reloc)
{ {
Elf32_Addr *const reloc_addr = (void *) (l_addr + reloc->r_offset); Elf32_Addr *const reloc_addr = (void *) (l_addr + reloc->r_offset);
/* Check for unexpected PLT reloc type. */ /* Check for unexpected PLT reloc type. */
assert (ELF32_R_TYPE (reloc->r_info) == R_ARM_JUMP_SLOT); if (ELF32_R_TYPE (reloc->r_info) == R_ARM_JUMP_SLOT)
*reloc_addr += l_addr; *reloc_addr += l_addr;
else
_dl_reloc_bad_type (map, ELF32_R_TYPE (reloc->r_info), 1);
} }
#endif /* RESOLVE */ #endif /* RESOLVE */

View File

@ -1,5 +1,5 @@
/* Machine-dependent ELF dynamic relocation inline functions. Stub version. /* Machine-dependent ELF dynamic relocation inline functions. Stub version.
Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. Copyright (C) 1995, 1996, 1997, 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -19,7 +19,6 @@
#define ELF_MACHINE_NAME "stub" #define ELF_MACHINE_NAME "stub"
#include <assert.h>
#include <string.h> #include <string.h>
#include <link.h> #include <link.h>
@ -81,7 +80,7 @@ elf_machine_rel (Elf32_Addr loadaddr, Elf32_Dyn *info[DT_NUM],
memcpy (reloc_addr, (void *) (loadbase + sym->st_value), sym->st_size); memcpy (reloc_addr, (void *) (loadbase + sym->st_value), sym->st_size);
break; break;
default: default:
assert (! "unexpected dynamic reloc type"); _dl_reloc_bad_type (map, ELF32_R_TYPE (reloc->r_info), 0);
break; break;
} }
} }

View File

@ -24,8 +24,6 @@
#include <sys/param.h> #include <sys/param.h>
#include <assert.h>
/* Return nonzero iff E_MACHINE is compatible with the running host. */ /* Return nonzero iff E_MACHINE is compatible with the running host. */
static inline int __attribute__ ((unused)) static inline int __attribute__ ((unused))
elf_machine_matches_host (Elf32_Half e_machine) elf_machine_matches_host (Elf32_Half e_machine)
@ -377,19 +375,22 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
*reloc_addr += (value - (Elf32_Addr) reloc_addr); *reloc_addr += (value - (Elf32_Addr) reloc_addr);
break; break;
default: default:
assert (! "unexpected dynamic reloc type"); _dl_reloc_bad_type (map, ELFW(R_TYPE) (reloc->r_info), 0);
break; break;
} }
} }
} }
static inline void static inline void
elf_machine_lazy_rel (Elf32_Addr l_addr, const Elf32_Rel *reloc) elf_machine_lazy_rel (struct link_map *map,
Elf32_Addr l_addr, const Elf32_Rel *reloc)
{ {
Elf32_Addr *const reloc_addr = (void *) (l_addr + reloc->r_offset); Elf32_Addr *const reloc_addr = (void *) (l_addr + reloc->r_offset);
/* Check for unexpected PLT reloc type. */ /* Check for unexpected PLT reloc type. */
assert (ELF32_R_TYPE (reloc->r_info) == R_386_JMP_SLOT); if (ELF32_R_TYPE (reloc->r_info) == R_386_JMP_SLOT)
*reloc_addr += l_addr; *reloc_addr += l_addr;
else
_dl_reloc_bad_type (map, ELFW(R_TYPE) (reloc->r_info), 1);
} }
#endif /* RESOLVE */ #endif /* RESOLVE */

View File

@ -24,8 +24,6 @@
#include <sys/param.h> #include <sys/param.h>
#include <assert.h>
/* Return nonzero iff E_MACHINE is compatible with the running host. */ /* Return nonzero iff E_MACHINE is compatible with the running host. */
static inline int static inline int
elf_machine_matches_host (Elf32_Half e_machine) elf_machine_matches_host (Elf32_Half e_machine)
@ -313,18 +311,21 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
case R_68K_NONE: /* Alright, Wilbur. */ case R_68K_NONE: /* Alright, Wilbur. */
break; break;
default: default:
assert (! "unexpected dynamic reloc type"); _dl_reloc_bad_type (map, ELF32_R_TYPE (reloc->r_info), 0);
break; break;
} }
} }
} }
static inline void static inline void
elf_machine_lazy_rel (Elf32_Addr l_addr, const Elf32_Rela *reloc) elf_machine_lazy_rel (struct link_map *map,
Elf32_Addr l_addr, const Elf32_Rela *reloc)
{ {
Elf32_Addr *const reloc_addr = (void *) (l_addr + reloc->r_offset); Elf32_Addr *const reloc_addr = (void *) (l_addr + reloc->r_offset);
assert (ELF32_R_TYPE (reloc->r_info) == R_68K_JMP_SLOT); if (ELF32_R_TYPE (reloc->r_info) == R_68K_JMP_SLOT)
*reloc_addr += l_addr; *reloc_addr += l_addr;
else
_dl_reloc_bad_type (map, ELF32_R_TYPE (reloc->r_info), 1);
} }
#endif /* RESOLVE */ #endif /* RESOLVE */

View File

@ -25,7 +25,6 @@
#define ELF_MACHINE_NO_PLT #define ELF_MACHINE_NO_PLT
#include <assert.h>
#include <entry.h> #include <entry.h>
#ifndef ENTRY_POINT #ifndef ENTRY_POINT
@ -567,13 +566,14 @@ elf_machine_rel (struct link_map *map, const ElfW(Rel) *reloc,
case R_MIPS_NONE: /* Alright, Wilbur. */ case R_MIPS_NONE: /* Alright, Wilbur. */
break; break;
default: default:
assert (! "unexpected dynamic reloc type"); _dl_reloc_bad_type (map, ELFW(R_TYPE) (reloc->r_info), 0);
break; break;
} }
} }
static inline void static inline void
elf_machine_lazy_rel (ElfW(Addr) l_addr, const ElfW(Rel) *reloc) elf_machine_lazy_rel (struct link_map *map,
ElfW(Addr) l_addr, const ElfW(Rel) *reloc)
{ {
/* Do nothing. */ /* Do nothing. */
} }

View File

@ -25,7 +25,6 @@
#define ELF_MACHINE_NO_PLT #define ELF_MACHINE_NO_PLT
#include <assert.h>
#include <entry.h> #include <entry.h>
#ifndef ENTRY_POINT #ifndef ENTRY_POINT
@ -562,13 +561,14 @@ elf_machine_rel (struct link_map *map, const ElfW(Rel) *reloc,
case R_MIPS_NONE: /* Alright, Wilbur. */ case R_MIPS_NONE: /* Alright, Wilbur. */
break; break;
default: default:
assert (! "unexpected dynamic reloc type"); _dl_reloc_bad_type (map, ELFW(R_TYPE) (reloc->r_info), 0);
break; break;
} }
} }
static inline void static inline void
elf_machine_lazy_rel (struct link_map *map, const ElfW(Rel) *reloc) elf_machine_lazy_rel (struct link_map *map, ElfW(Addr) l_addr,
const ElfW(Rel) *reloc)
{ {
/* Do nothing. */ /* Do nothing. */
} }

View File

@ -426,8 +426,7 @@ __process_machine_rela (struct link_map *map,
return; return;
default: default:
_dl_sysdep_error (_dl_argv[0] ?: "<program name unknown>", _dl_reloc_bad_type (map, rinfo, 0);
": Unknown relocation type\n", NULL);
return; return;
} }

View File

@ -1,5 +1,5 @@
/* Machine-dependent ELF dynamic relocation inline functions. PowerPC version. /* Machine-dependent ELF dynamic relocation inline functions. PowerPC version.
Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. Copyright (C) 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -239,7 +239,8 @@ extern int __elf_machine_runtime_setup (struct link_map *map,
#define elf_machine_runtime_setup __elf_machine_runtime_setup #define elf_machine_runtime_setup __elf_machine_runtime_setup
static inline void static inline void
elf_machine_lazy_rel (Elf32_Addr l_addr, const Elf32_Rela *reloc) elf_machine_lazy_rel (struct link_map *map,
Elf32_Addr l_addr, const Elf32_Rela *reloc)
{ {
/* elf_machine_runtime_setup handles this. */ /* elf_machine_runtime_setup handles this. */
} }

View File

@ -19,7 +19,6 @@
#define ELF_MACHINE_NAME "sparc" #define ELF_MACHINE_NAME "sparc"
#include <assert.h>
#include <string.h> #include <string.h>
#include <sys/param.h> #include <sys/param.h>
#include <elf/ldsodefs.h> #include <elf/ldsodefs.h>
@ -430,14 +429,15 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
case R_SPARC_NONE: /* Alright, Wilbur. */ case R_SPARC_NONE: /* Alright, Wilbur. */
break; break;
default: default:
assert (! "unexpected dynamic reloc type"); _dl_reloc_bad_type (map, ELFW(R_TYPE) (reloc->r_info), 0);
break; break;
} }
} }
} }
static inline void static inline void
elf_machine_lazy_rel (Elf32_Addr l_addr, const Elf32_Rela *reloc) elf_machine_lazy_rel (struct link_map *map,
Elf32_Addr l_addr, const Elf32_Rela *reloc)
{ {
switch (ELF32_R_TYPE (reloc->r_info)) switch (ELF32_R_TYPE (reloc->r_info))
{ {
@ -446,7 +446,7 @@ elf_machine_lazy_rel (Elf32_Addr l_addr, const Elf32_Rela *reloc)
case R_SPARC_JMP_SLOT: case R_SPARC_JMP_SLOT:
break; break;
default: default:
assert (! "unexpected PLT reloc type"); _dl_reloc_bad_type (map, ELFW(R_TYPE) (reloc->r_info), 1);
break; break;
} }
} }

View File

@ -19,7 +19,6 @@
#define ELF_MACHINE_NAME "sparc64" #define ELF_MACHINE_NAME "sparc64"
#include <assert.h>
#include <string.h> #include <string.h>
#include <sys/param.h> #include <sys/param.h>
#include <elf/ldsodefs.h> #include <elf/ldsodefs.h>
@ -310,14 +309,15 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
break; break;
default: default:
assert (! "unexpected dynamic reloc type"); _dl_reloc_bad_type (map, ELFW(R_TYPE) (reloc->r_info), 0);
break; break;
} }
} }
} }
static inline void static inline void
elf_machine_lazy_rel (Elf64_Addr l_addr, const Elf64_Rela *reloc) elf_machine_lazy_rel (struct link_map *map,
Elf64_Addr l_addr, const Elf64_Rela *reloc)
{ {
switch (ELF64_R_TYPE (reloc->r_info)) switch (ELF64_R_TYPE (reloc->r_info))
{ {
@ -326,7 +326,7 @@ elf_machine_lazy_rel (Elf64_Addr l_addr, const Elf64_Rela *reloc)
case R_SPARC_JMP_SLOT: case R_SPARC_JMP_SLOT:
break; break;
default: default:
assert (! "unexpected PLT reloc type"); _dl_reloc_bad_type (map, ELFW(R_TYPE) (reloc->r_info), 1);
break; break;
} }
} }