rtld: disable relro enforcement for irelative relocation processing.

This fixes yet another breakage for relro + bind now.

Reported by:	emaste
Sponsored by:	The FreeBSD Foundation
MFC after:	3 days
This commit is contained in:
Konstantin Belousov 2019-03-27 22:35:28 +00:00
parent ca219866e3
commit ad484b8c53
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=345620

View File

@ -2956,14 +2956,14 @@ resolve_object_ifunc(Obj_Entry *obj, bool bind_now, int flags,
if (obj->ifuncs_resolved)
return (0);
obj->ifuncs_resolved = true;
if (obj->irelative && reloc_iresolve(obj, lockstate) == -1)
if (!obj->irelative && !((obj->bind_now || bind_now) && obj->gnu_ifunc))
return (0);
if (obj_disable_relro(obj) == -1 ||
(obj->irelative && reloc_iresolve(obj, lockstate) == -1) ||
((obj->bind_now || bind_now) && obj->gnu_ifunc &&
reloc_gnu_ifunc(obj, flags, lockstate) == -1) ||
obj_enforce_relro(obj) == -1)
return (-1);
if ((obj->bind_now || bind_now) && obj->gnu_ifunc) {
if (obj_disable_relro(obj) ||
reloc_gnu_ifunc(obj, flags, lockstate) == -1 ||
obj_enforce_relro(obj))
return (-1);
}
return (0);
}