• Jessica Yu's avatar
    module: check for exit sections in layout_sections() instead of module_init_section() · 055f23b7
    Jessica Yu authored
    Previously, when CONFIG_MODULE_UNLOAD=n, the module loader just does not
    attempt to load exit sections since it never expects that any code in those
    sections will ever execute. However, dynamic code patching (alternatives,
    jump_label and static_call) can have sites in __exit code, even if __exit is
    never executed. Therefore __exit must be present at runtime, at least for as
    long as __init code is.
    
    Commit 33121347 ("module: treat exit sections the same as init
    sections when !CONFIG_MODULE_UNLOAD") solves the requirements of
    jump_labels and static_calls by putting the exit sections in the init
    region of the module so that they are at least present at init, and
    discarded afterwards. It does this by including a check for exit
    sections in module_init_section(), so that it also returns true for exit
    sections, and the module loader will automatically sort them in the init
    region of the module.
    
    However, the solution there was not completely arch-independent. ARM is
    a special case where it supplies its own module_{init, exit}_section()
    functions. Instead of pushing the exit section checks into
    module_init_section(), just implement the exit section check in
    layout_sections(), so that we don't have to touch arch-dependent code.
    
    Fixes: 33121347 ("module: treat exit sections the same as init sections when !CONFIG_MODULE_UNLOAD")
    Reviewed-by: default avatarRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
    Signed-off-by: default avatarJessica Yu <jeyu@kernel.org>
    055f23b7
module.c 119 KB