Changeset View
Changeset View
Standalone View
Standalone View
libexec/rtld-elf/aarch64/reloc.c
Show First 20 Lines • Show All 252 Lines • ▼ Show 20 Lines | case R_AARCH64_JUMP_SLOT: | ||||
break; | break; | ||||
} | } | ||||
} | } | ||||
obj->jmpslots_done = true; | obj->jmpslots_done = true; | ||||
return (0); | return (0); | ||||
} | } | ||||
int | static void | ||||
reloc_iresolve(Obj_Entry *obj, struct Struct_RtldLockState *lockstate) | reloc_iresolve_one(Obj_Entry *obj, const Elf_Rela *rela, | ||||
RtldLockState *lockstate) | |||||
{ | { | ||||
const Elf_Rela *relalim; | |||||
const Elf_Rela *rela; | |||||
Elf_Addr *where, target, *ptr; | Elf_Addr *where, target, *ptr; | ||||
if (!obj->irelative) | |||||
return (0); | |||||
relalim = (const Elf_Rela *)((const char *)obj->pltrela + obj->pltrelasize); | |||||
for (rela = obj->pltrela; rela < relalim; rela++) { | |||||
if (ELF_R_TYPE(rela->r_info) == R_AARCH64_IRELATIVE) { | |||||
ptr = (Elf_Addr *)(obj->relocbase + rela->r_addend); | ptr = (Elf_Addr *)(obj->relocbase + rela->r_addend); | ||||
where = (Elf_Addr *)(obj->relocbase + rela->r_offset); | where = (Elf_Addr *)(obj->relocbase + rela->r_offset); | ||||
lock_release(rtld_bind_lock, lockstate); | lock_release(rtld_bind_lock, lockstate); | ||||
target = call_ifunc_resolver(ptr); | target = call_ifunc_resolver(ptr); | ||||
wlock_acquire(rtld_bind_lock, lockstate); | wlock_acquire(rtld_bind_lock, lockstate); | ||||
*where = target; | *where = target; | ||||
} | } | ||||
} | |||||
int | |||||
reloc_iresolve(Obj_Entry *obj, struct Struct_RtldLockState *lockstate) | |||||
{ | |||||
const Elf_Rela *relalim; | |||||
const Elf_Rela *rela; | |||||
if (!obj->irelative) | |||||
return (0); | |||||
obj->irelative = false; | obj->irelative = false; | ||||
relalim = (const Elf_Rela *)((const char *)obj->pltrela + | |||||
obj->pltrelasize); | |||||
for (rela = obj->pltrela; rela < relalim; rela++) { | |||||
if (ELF_R_TYPE(rela->r_info) == R_AARCH64_IRELATIVE) | |||||
reloc_iresolve_one(obj, rela, lockstate); | |||||
} | |||||
return (0); | return (0); | ||||
} | } | ||||
int | int | ||||
reloc_iresolve_nonplt(Obj_Entry *obj, struct Struct_RtldLockState *lockstate) | |||||
{ | |||||
const Elf_Rela *relalim; | |||||
const Elf_Rela *rela; | |||||
if (!obj->irelative_nonplt) | |||||
return (0); | |||||
obj->irelative_nonplt = false; | |||||
relalim = (const Elf_Rela *)((const char *)obj->rela + obj->relasize); | |||||
for (rela = obj->rela; rela < relalim; rela++) { | |||||
if (ELF_R_TYPE(rela->r_info) == R_AARCH64_IRELATIVE) | |||||
reloc_iresolve_one(obj, rela, lockstate); | |||||
} | |||||
return (0); | |||||
} | |||||
int | |||||
reloc_gnu_ifunc(Obj_Entry *obj, int flags, | reloc_gnu_ifunc(Obj_Entry *obj, int flags, | ||||
struct Struct_RtldLockState *lockstate) | struct Struct_RtldLockState *lockstate) | ||||
{ | { | ||||
const Elf_Rela *relalim; | const Elf_Rela *relalim; | ||||
const Elf_Rela *rela; | const Elf_Rela *rela; | ||||
Elf_Addr *where, target; | Elf_Addr *where, target; | ||||
const Elf_Sym *def; | const Elf_Sym *def; | ||||
const Obj_Entry *defobj; | const Obj_Entry *defobj; | ||||
▲ Show 20 Lines • Show All 198 Lines • ▼ Show 20 Lines | case R_AARCH64_TLS_DTPREL64: /* efectively is TLS_DTPMOD64 */ | ||||
break; | break; | ||||
case R_AARCH64_TLS_DTPMOD64: /* efectively is TLS_DTPREL64 */ | case R_AARCH64_TLS_DTPMOD64: /* efectively is TLS_DTPREL64 */ | ||||
*where += (Elf_Addr)(def->st_value + rela->r_addend); | *where += (Elf_Addr)(def->st_value + rela->r_addend); | ||||
break; | break; | ||||
case R_AARCH64_RELATIVE: | case R_AARCH64_RELATIVE: | ||||
*where = (Elf_Addr)(obj->relocbase + rela->r_addend); | *where = (Elf_Addr)(obj->relocbase + rela->r_addend); | ||||
break; | break; | ||||
case R_AARCH64_NONE: | case R_AARCH64_NONE: | ||||
break; | |||||
case R_AARCH64_IRELATIVE: | |||||
obj->irelative_nonplt = true; | |||||
break; | break; | ||||
default: | default: | ||||
rtld_printf("%s: Unhandled relocation %lu\n", | rtld_printf("%s: Unhandled relocation %lu\n", | ||||
obj->path, ELF_R_TYPE(rela->r_info)); | obj->path, ELF_R_TYPE(rela->r_info)); | ||||
return (-1); | return (-1); | ||||
} | } | ||||
} | } | ||||
Show All 32 Lines |