Revert "Additional icache paranoia: non-PLT relocations can modify the text segment."
reloc_nonplt_object, and thus reloc_non_plt, only ever handles data
relocations, so this paranoia is completely unfounded and only has the
effect of significantly slowing down program startup for binaries with
large amounts of code, like Clang.
If this breaks any systems, that would likely be due to insufficient
flushing in the pmap implementation for executable mappings, as this
existing rtld behaviour would mask any such bugs.
This reverts commit 4b51c69976.
Reviewed by: adrian
Differential Revision: https://reviews.freebsd.org/D54221
This commit is contained in:
@@ -332,7 +332,6 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld, int flags,
|
||||
{
|
||||
const Elf_Rela *relalim;
|
||||
const Elf_Rela *rela;
|
||||
const Elf_Phdr *phdr;
|
||||
SymCache *cache;
|
||||
int r = -1;
|
||||
|
||||
@@ -361,18 +360,6 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld, int flags,
|
||||
done:
|
||||
if (cache != NULL)
|
||||
free(cache);
|
||||
|
||||
/*
|
||||
* Synchronize icache for executable segments in case we made
|
||||
* any changes.
|
||||
*/
|
||||
for (phdr = obj->phdr; phdr < obj->phdr + obj->phnum; phdr++) {
|
||||
if (phdr->p_type == PT_LOAD && (phdr->p_flags & PF_X) != 0) {
|
||||
__syncicache(obj->relocbase + phdr->p_vaddr,
|
||||
phdr->p_memsz);
|
||||
}
|
||||
}
|
||||
|
||||
return (r);
|
||||
}
|
||||
|
||||
|
||||
@@ -327,7 +327,6 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld, int flags,
|
||||
{
|
||||
const Elf_Rela *relalim;
|
||||
const Elf_Rela *rela;
|
||||
const Elf_Phdr *phdr;
|
||||
SymCache *cache;
|
||||
int bytes = obj->dynsymcount * sizeof(SymCache);
|
||||
int r = -1;
|
||||
@@ -359,18 +358,6 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld, int flags,
|
||||
done:
|
||||
if (cache)
|
||||
munmap(cache, bytes);
|
||||
|
||||
/*
|
||||
* Synchronize icache for executable segments in case we made
|
||||
* any changes.
|
||||
*/
|
||||
for (phdr = obj->phdr; phdr < obj->phdr + obj->phnum; phdr++) {
|
||||
if (phdr->p_type == PT_LOAD && (phdr->p_flags & PF_X) != 0) {
|
||||
__syncicache(obj->relocbase + phdr->p_vaddr,
|
||||
phdr->p_memsz);
|
||||
}
|
||||
}
|
||||
|
||||
return (r);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user