Handle non-PLT GNU IFUNC relocations in rtld
In the last IFUNC related changes to rtld, the code that handled non-PLT GNU IFUNC relocations ended up getting lost. This could leave some relocations unhandled, causing crashes or misbehavior. This change restores the handling of these relocations, but now together with the other IFUNC relocations, allowing resolvers to reference external symbols. Reviewed by: kib MFC after: 2 weeks Sponsored by: Eldorado Research Institute (eldorado.org.br) Differential Revision: https://reviews.freebsd.org/D25550
This commit is contained in:
parent
6daf14915b
commit
3f99871ddb
@ -3111,7 +3111,8 @@ resolve_object_ifunc(Obj_Entry *obj, bool bind_now, int flags,
|
||||
return (0);
|
||||
obj->ifuncs_resolved = true;
|
||||
if (!obj->irelative && !obj->irelative_nonplt &&
|
||||
!((obj->bind_now || bind_now) && obj->gnu_ifunc))
|
||||
!((obj->bind_now || bind_now) && obj->gnu_ifunc) &&
|
||||
!obj->non_plt_gnu_ifunc)
|
||||
return (0);
|
||||
if (obj_disable_relro(obj) == -1 ||
|
||||
(obj->irelative && reloc_iresolve(obj, lockstate) == -1) ||
|
||||
@ -3119,6 +3120,8 @@ resolve_object_ifunc(Obj_Entry *obj, bool bind_now, int flags,
|
||||
lockstate) == -1) ||
|
||||
((obj->bind_now || bind_now) && obj->gnu_ifunc &&
|
||||
reloc_gnu_ifunc(obj, flags, lockstate) == -1) ||
|
||||
(obj->non_plt_gnu_ifunc && reloc_non_plt(obj, &obj_rtld,
|
||||
flags | SYMLOOK_IFUNC, lockstate) == -1) ||
|
||||
obj_enforce_relro(obj) == -1)
|
||||
return (-1);
|
||||
return (0);
|
||||
|
Loading…
x
Reference in New Issue
Block a user