• Miroslav Benes's avatar
    module: keep percpu symbols in module's symtab · 7e35bc65
    Miroslav Benes authored
    commit e0224418 upstream.
    
    Currently, percpu symbols from .data..percpu ELF section of a module are
    not copied over and stored in final symtab array of struct module.
    Consequently such symbol cannot be returned via kallsyms API (for
    example kallsyms_lookup_name). This can be especially confusing when the
    percpu symbol is exported. Only its __ksymtab et al. are present in its
    symtab.
    
    The culprit is in layout_and_allocate() function where SHF_ALLOC flag is
    dropped for .data..percpu section. There is in fact no need to copy the
    section to final struct module, because kernel module loader allocates
    extra percpu section by itself. Unfortunately only symbols from
    SHF_ALLOC sections are copied due to a check in is_core_symbol().
    
    The patch changes is_core_symbol() function to copy over also percpu
    symbols (their st_shndx points to .data..percpu ELF section). We do it
    only if CONFIG_KALLSYMS_ALL is set to be consistent with the rest of the
    function (ELF section is SHF_ALLOC but !SHF_EXECINSTR). Finally
    elf_type() returns type 'a' for a percpu symbol because its address is
    absolute.
    Signed-off-by: default avatarMiroslav Benes <mbenes@suse.cz>
    Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
    Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    7e35bc65
module.c 104 KB