mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-12-28 05:34:13 -05:00
Merge tag 'modules-for-v5.13' of git://git.kernel.org/pub/scm/linux/kernel/git/jeyu/linux
Pull module updates from Jessica Yu:
"Fix an age old bug involving jump_calls and static_labels when
CONFIG_MODULE_UNLOAD=n.
When CONFIG_MODULE_UNLOAD=n, it means you can't unload modules, so
normally the __exit sections of a module are not loaded at all.
However, dynamic code patching (jump_label, static_call, alternatives)
can have sites in __exit sections even if __exit is never executed.
Reported by Peter Zijlstra:
'Alternatives, jump_labels and static_call all can have relocations
into __exit code. Not loading it at all would be BAD.'
Therefore, load the __exit sections even when CONFIG_MODULE_UNLOAD=n,
and discard them after init"
* tag 'modules-for-v5.13' of git://git.kernel.org/pub/scm/linux/kernel/git/jeyu/linux:
module: treat exit sections the same as init sections when !CONFIG_MODULE_UNLOAD
This commit is contained in:
@@ -2807,7 +2807,11 @@ void * __weak module_alloc(unsigned long size)
|
||||
|
||||
bool __weak module_init_section(const char *name)
|
||||
{
|
||||
#ifndef CONFIG_MODULE_UNLOAD
|
||||
return strstarts(name, ".init") || module_exit_section(name);
|
||||
#else
|
||||
return strstarts(name, ".init");
|
||||
#endif
|
||||
}
|
||||
|
||||
bool __weak module_exit_section(const char *name)
|
||||
@@ -3121,11 +3125,6 @@ static int rewrite_section_headers(struct load_info *info, int flags)
|
||||
*/
|
||||
shdr->sh_addr = (size_t)info->hdr + shdr->sh_offset;
|
||||
|
||||
#ifndef CONFIG_MODULE_UNLOAD
|
||||
/* Don't load .exit sections */
|
||||
if (module_exit_section(info->secstrings+shdr->sh_name))
|
||||
shdr->sh_flags &= ~(unsigned long)SHF_ALLOC;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Track but don't keep modinfo and version sections. */
|
||||
|
||||
Reference in New Issue
Block a user