/* * Since some arches are moving towards PAGE_KERNEL module allocations instead * of PAGE_KERNEL_EXEC, keep module_enable_x() independent of * CONFIG_STRICT_MODULE_RWX because they are needed regardless of whether we * are strict.
*/ int module_enable_text_rox(conststruct module *mod)
{
for_class_mod_mem_type(type, text) { conststruct module_memory *mem = &mod->mem[type]; int ret;
if (mem->is_rox)
ret = execmem_restore_rox(mem->base, mem->size); elseif (IS_ENABLED(CONFIG_STRICT_MODULE_RWX))
ret = module_set_memory(mod, type, set_memory_rox); else
ret = module_set_memory(mod, type, set_memory_x); if (ret) return ret;
} return 0;
}
int module_enable_rodata_ro(conststruct module *mod)
{ int ret;
if (!IS_ENABLED(CONFIG_STRICT_MODULE_RWX) || !rodata_enabled) return 0;
ret = module_set_memory(mod, MOD_RODATA, set_memory_ro); if (ret) return ret;
ret = module_set_memory(mod, MOD_INIT_RODATA, set_memory_ro); if (ret) return ret;
return 0;
}
int module_enable_rodata_ro_after_init(conststruct module *mod)
{ if (!IS_ENABLED(CONFIG_STRICT_MODULE_RWX) || !rodata_enabled) return 0;
if (!IS_ENABLED(CONFIG_STRICT_MODULE_RWX)) return 0;
for (i = 0; i < hdr->e_shnum; i++) { if ((sechdrs[i].sh_flags & shf_wx) == shf_wx) {
pr_err("%s: section %s (index %d) has invalid WRITE|EXEC flags\n",
mod->name, secstrings + sechdrs[i].sh_name, i); return -ENOEXEC;
}
}
return 0;
}
staticconstchar *const ro_after_init[] = { /* * Section .data..ro_after_init holds data explicitly annotated by * __ro_after_init.
*/ ".data..ro_after_init",
/* * Section __jump_table holds data structures that are never modified, * with the exception of entries that refer to code in the __init * section, which are marked as such at module load time.
*/ "__jump_table",
#ifdef CONFIG_HAVE_STATIC_CALL_INLINE /* * Section .static_call_sites holds data structures that need to be * sorted and processed at module load time but are never modified * afterwards.
*/ ".static_call_sites", #endif
};
void module_mark_ro_after_init(const Elf_Ehdr *hdr, Elf_Shdr *sechdrs, constchar *secstrings)
{ int i, j;
for (i = 1; i < hdr->e_shnum; i++) {
Elf_Shdr *shdr = &sechdrs[i];
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.