(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:
parent
d42c91d9d2
commit
fea9a86a67
|
@ -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,60 +210,50 @@ 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;
|
|
||||||
|
|
||||||
switch (ELF32_R_TYPE (reloc->r_info))
|
if (ELF32_R_TYPE (reloc->r_info) == R_68K_RELATIVE)
|
||||||
|
*reloc_addr = map->l_addr + reloc->r_addend;
|
||||||
|
else
|
||||||
{
|
{
|
||||||
case R_68K_COPY:
|
Elf32_Addr value = RESOLVE (&sym, version, ELF32_R_TYPE (reloc->r_info));
|
||||||
loadbase = RESOLVE (&sym, version, DL_LOOKUP_NOEXEC);
|
if (sym)
|
||||||
memcpy (reloc_addr, (void *) (loadbase + sym->st_value), sym->st_size);
|
value += sym->st_value;
|
||||||
break;
|
|
||||||
case R_68K_GLOB_DAT:
|
switch (ELF32_R_TYPE (reloc->r_info))
|
||||||
loadbase = RESOLVE (&sym, version, 0);
|
{
|
||||||
*reloc_addr = sym ? (loadbase + sym->st_value) : 0;
|
case R_68K_COPY:
|
||||||
break;
|
memcpy (reloc_addr, (void *) value, sym->st_size);
|
||||||
case R_68K_JMP_SLOT:
|
break;
|
||||||
loadbase = RESOLVE (&sym, version, DL_LOOKUP_NOPLT);
|
case R_68K_GLOB_DAT:
|
||||||
*reloc_addr = sym ? (loadbase + sym->st_value) : 0;
|
case R_68K_JMP_SLOT:
|
||||||
break;
|
*reloc_addr = value;
|
||||||
case R_68K_8:
|
break;
|
||||||
loadbase = RESOLVE (&sym, version, 0);
|
case R_68K_8:
|
||||||
*(char *) reloc_addr = ((sym ? (loadbase + sym->st_value) : 0)
|
*(char *) reloc_addr = value + reloc->r_addend;
|
||||||
+ reloc->r_addend);
|
break;
|
||||||
break;
|
case R_68K_16:
|
||||||
case R_68K_16:
|
*(short *) reloc_addr = value + reloc->r_addend;
|
||||||
loadbase = RESOLVE (&sym, version, 0);
|
break;
|
||||||
*(short *) reloc_addr = ((sym ? (loadbase + sym->st_value) : 0)
|
case R_68K_32:
|
||||||
+ reloc->r_addend);
|
*reloc_addr = value + reloc->r_addend;
|
||||||
break;
|
break;
|
||||||
case R_68K_32:
|
case R_68K_PC8:
|
||||||
loadbase = RESOLVE (&sym, version, 0);
|
*(char *) reloc_addr
|
||||||
*reloc_addr = ((sym ? (loadbase + sym->st_value) : 0)
|
= value + reloc->r_addend - (Elf32_Addr) reloc_addr;
|
||||||
+ reloc->r_addend);
|
break;
|
||||||
break;
|
case R_68K_PC16:
|
||||||
case R_68K_RELATIVE:
|
*(short *) reloc_addr
|
||||||
*reloc_addr = map->l_addr + reloc->r_addend;
|
= value + reloc->r_addend - (Elf32_Addr) reloc_addr;
|
||||||
break;
|
break;
|
||||||
case R_68K_PC8:
|
case R_68K_PC32:
|
||||||
loadbase = RESOLVE (&sym, version, 0);
|
*reloc_addr = value + reloc->r_addend - (Elf32_Addr) reloc_addr;
|
||||||
*(char *) reloc_addr = ((sym ? (loadbase + sym->st_value) : 0)
|
break;
|
||||||
+ reloc->r_addend - (Elf32_Addr) reloc_addr);
|
case R_68K_NONE: /* Alright, Wilbur. */
|
||||||
break;
|
break;
|
||||||
case R_68K_PC16:
|
default:
|
||||||
loadbase = RESOLVE (&sym, version, 0);
|
assert (! "unexpected dynamic reloc type");
|
||||||
*(short *) reloc_addr = ((sym ? (loadbase + sym->st_value) : 0)
|
break;
|
||||||
+ reloc->r_addend - (Elf32_Addr) reloc_addr);
|
}
|
||||||
break;
|
|
||||||
case R_68K_PC32:
|
|
||||||
loadbase = RESOLVE (&sym, version, 0);
|
|
||||||
*reloc_addr = ((sym ? (loadbase + sym->st_value) : 0)
|
|
||||||
+ reloc->r_addend - (Elf32_Addr) reloc_addr);
|
|
||||||
break;
|
|
||||||
case R_68K_NONE: /* Alright, Wilbur. */
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
assert (! "unexpected dynamic reloc type");
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue