mirror of
https://sourceware.org/git/glibc.git
synced 2025-12-17 05:12:47 +03:00
(elf_machine_rela): Rewritten as for i386.
(elf_machine_lookup_noexec_p, elf_machine_lookup_noplt_p, ELF_MACHINE_RELOC_NOPLT): Define.
This commit is contained in:
@@ -184,9 +184,16 @@ _dl_start_user:
|
|||||||
| Jump to the user's entry point.
|
| Jump to the user's entry point.
|
||||||
jmp (%a4)");
|
jmp (%a4)");
|
||||||
|
|
||||||
|
/* Nonzero iff TYPE describes a relocation that should
|
||||||
|
skip the executable when looking up the symbol value. */
|
||||||
|
#define elf_machine_lookup_noexec_p(type) ((type) == R_68K_COPY)
|
||||||
|
|
||||||
/* Nonzero iff TYPE describes relocation of a PLT entry, so
|
/* Nonzero iff TYPE describes relocation of a PLT entry, so
|
||||||
PLT entries should not be allowed to define the value. */
|
PLT entries should not be allowed to define the value. */
|
||||||
#define elf_machine_pltrel_p(type) ((type) == R_68K_JMP_SLOT)
|
#define elf_machine_lookup_noplt_p(type) ((type) == R_68K_JMP_SLOT)
|
||||||
|
|
||||||
|
/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
|
||||||
|
#define ELF_MACHINE_RELOC_NOPLT R_68K_JMP_SLOT
|
||||||
|
|
||||||
/* The m68k never uses Elf32_Rel relocations. */
|
/* The m68k never uses Elf32_Rel relocations. */
|
||||||
#define ELF_MACHINE_NO_REL 1
|
#define ELF_MACHINE_NO_REL 1
|
||||||
@@ -203,54 +210,43 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
|
|||||||
const Elf32_Sym *sym, const struct r_found_version *version)
|
const Elf32_Sym *sym, const struct r_found_version *version)
|
||||||
{
|
{
|
||||||
Elf32_Addr *const reloc_addr = (void *) (map->l_addr + reloc->r_offset);
|
Elf32_Addr *const reloc_addr = (void *) (map->l_addr + reloc->r_offset);
|
||||||
Elf32_Addr loadbase;
|
|
||||||
|
if (ELF32_R_TYPE (reloc->r_info) == R_68K_RELATIVE)
|
||||||
|
*reloc_addr = map->l_addr + reloc->r_addend;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Elf32_Addr value = RESOLVE (&sym, version, ELF32_R_TYPE (reloc->r_info));
|
||||||
|
if (sym)
|
||||||
|
value += sym->st_value;
|
||||||
|
|
||||||
switch (ELF32_R_TYPE (reloc->r_info))
|
switch (ELF32_R_TYPE (reloc->r_info))
|
||||||
{
|
{
|
||||||
case R_68K_COPY:
|
case R_68K_COPY:
|
||||||
loadbase = RESOLVE (&sym, version, DL_LOOKUP_NOEXEC);
|
memcpy (reloc_addr, (void *) value, sym->st_size);
|
||||||
memcpy (reloc_addr, (void *) (loadbase + sym->st_value), sym->st_size);
|
|
||||||
break;
|
break;
|
||||||
case R_68K_GLOB_DAT:
|
case R_68K_GLOB_DAT:
|
||||||
loadbase = RESOLVE (&sym, version, 0);
|
|
||||||
*reloc_addr = sym ? (loadbase + sym->st_value) : 0;
|
|
||||||
break;
|
|
||||||
case R_68K_JMP_SLOT:
|
case R_68K_JMP_SLOT:
|
||||||
loadbase = RESOLVE (&sym, version, DL_LOOKUP_NOPLT);
|
*reloc_addr = value;
|
||||||
*reloc_addr = sym ? (loadbase + sym->st_value) : 0;
|
|
||||||
break;
|
break;
|
||||||
case R_68K_8:
|
case R_68K_8:
|
||||||
loadbase = RESOLVE (&sym, version, 0);
|
*(char *) reloc_addr = value + reloc->r_addend;
|
||||||
*(char *) reloc_addr = ((sym ? (loadbase + sym->st_value) : 0)
|
|
||||||
+ reloc->r_addend);
|
|
||||||
break;
|
break;
|
||||||
case R_68K_16:
|
case R_68K_16:
|
||||||
loadbase = RESOLVE (&sym, version, 0);
|
*(short *) reloc_addr = value + reloc->r_addend;
|
||||||
*(short *) reloc_addr = ((sym ? (loadbase + sym->st_value) : 0)
|
|
||||||
+ reloc->r_addend);
|
|
||||||
break;
|
break;
|
||||||
case R_68K_32:
|
case R_68K_32:
|
||||||
loadbase = RESOLVE (&sym, version, 0);
|
*reloc_addr = value + reloc->r_addend;
|
||||||
*reloc_addr = ((sym ? (loadbase + sym->st_value) : 0)
|
|
||||||
+ reloc->r_addend);
|
|
||||||
break;
|
|
||||||
case R_68K_RELATIVE:
|
|
||||||
*reloc_addr = map->l_addr + reloc->r_addend;
|
|
||||||
break;
|
break;
|
||||||
case R_68K_PC8:
|
case R_68K_PC8:
|
||||||
loadbase = RESOLVE (&sym, version, 0);
|
*(char *) reloc_addr
|
||||||
*(char *) reloc_addr = ((sym ? (loadbase + sym->st_value) : 0)
|
= value + reloc->r_addend - (Elf32_Addr) reloc_addr;
|
||||||
+ reloc->r_addend - (Elf32_Addr) reloc_addr);
|
|
||||||
break;
|
break;
|
||||||
case R_68K_PC16:
|
case R_68K_PC16:
|
||||||
loadbase = RESOLVE (&sym, version, 0);
|
*(short *) reloc_addr
|
||||||
*(short *) reloc_addr = ((sym ? (loadbase + sym->st_value) : 0)
|
= value + reloc->r_addend - (Elf32_Addr) reloc_addr;
|
||||||
+ reloc->r_addend - (Elf32_Addr) reloc_addr);
|
|
||||||
break;
|
break;
|
||||||
case R_68K_PC32:
|
case R_68K_PC32:
|
||||||
loadbase = RESOLVE (&sym, version, 0);
|
*reloc_addr = value + reloc->r_addend - (Elf32_Addr) reloc_addr;
|
||||||
*reloc_addr = ((sym ? (loadbase + sym->st_value) : 0)
|
|
||||||
+ reloc->r_addend - (Elf32_Addr) reloc_addr);
|
|
||||||
break;
|
break;
|
||||||
case R_68K_NONE: /* Alright, Wilbur. */
|
case R_68K_NONE: /* Alright, Wilbur. */
|
||||||
break;
|
break;
|
||||||
@@ -258,6 +254,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
|
|||||||
assert (! "unexpected dynamic reloc type");
|
assert (! "unexpected dynamic reloc type");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
|
|||||||
Reference in New Issue
Block a user