/proc/kallsyms annotates module symbols as global (e.g. 'D' for a data symbol) or local (e.g. 'd'), depending on whether is_exported() returns true or false. Historically, is_exported() only returns true if the symbol was exported using EXPORT_SYMBOL(). EXPORT_SYMBOL_UNUSED(), for example, is not taken into account. This looks like an oversight, so let's fix it. Signed-off-by: Alan Jenkins <alan-jenkins@xxxxxxxxxxxxxx> --- kernel/module.c | 30 ++++++++---------------------- 1 files changed, 8 insertions(+), 22 deletions(-) diff --git a/kernel/module.c b/kernel/module.c index 56a7e65..021b9cc 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -1830,33 +1830,19 @@ static void free_modinfo(struct module *mod) #ifdef CONFIG_KALLSYMS -/* lookup symbol in given range of kernel_symbols */ -static const struct kernel_symbol *lookup_symbol(const char *name, - const struct kernel_symbol *syms, - unsigned int count) -{ - unsigned int i; - - for (i = 0; i < count; i++) - if (strcmp(syms[i].name, name) == 0) - return &syms[i]; - return NULL; -} - static int is_exported(const char *name, unsigned long value, - const struct module *mod) + struct module *mod) { - const struct ksymtab *symtab; - const struct kernel_symbol *ks; + const struct kernel_symbol *sym; + enum export_type type; + const unsigned long *crc; - if (!mod) - symtab = &ksymtab[EXPORT_TYPE_PLAIN]; + if (mod) + sym = find_symbol_in_module(mod, name, &type, &crc); else - symtab = &mod->syms[EXPORT_TYPE_PLAIN]; - - ks = lookup_symbol(name, symtab->syms, symtab->num_syms); + sym = find_symbol_in_kernel(name, &type, &crc); - return ks != NULL && ks->value == value; + return (sym && sym->value == value); } /* As per nm */ -- 1.6.3.3 -- To unsubscribe from this list: send the line "unsubscribe linux-kbuild" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html