Loading kernel/module.c +15 −11 Original line number Diff line number Diff line Loading @@ -3403,6 +3403,11 @@ static inline int is_arm_mapping_symbol(const char *str) && (str[2] == '\0' || str[2] == '.'); } static const char *symname(struct module *mod, unsigned int symnum) { return mod->strtab + mod->symtab[symnum].st_name; } static const char *get_ksymbol(struct module *mod, unsigned long addr, unsigned long *size, Loading @@ -3425,15 +3430,15 @@ static const char *get_ksymbol(struct module *mod, /* We ignore unnamed symbols: they're uninformative * and inserted at a whim. */ if (*symname(mod, i) == '\0' || is_arm_mapping_symbol(symname(mod, i))) continue; if (mod->symtab[i].st_value <= addr && mod->symtab[i].st_value > mod->symtab[best].st_value && *(mod->strtab + mod->symtab[i].st_name) != '\0' && !is_arm_mapping_symbol(mod->strtab + mod->symtab[i].st_name)) && mod->symtab[i].st_value > mod->symtab[best].st_value) best = i; if (mod->symtab[i].st_value > addr && mod->symtab[i].st_value < nextval && *(mod->strtab + mod->symtab[i].st_name) != '\0' && !is_arm_mapping_symbol(mod->strtab + mod->symtab[i].st_name)) && mod->symtab[i].st_value < nextval) nextval = mod->symtab[i].st_value; } Loading @@ -3444,7 +3449,7 @@ static const char *get_ksymbol(struct module *mod, *size = nextval - mod->symtab[best].st_value; if (offset) *offset = addr - mod->symtab[best].st_value; return mod->strtab + mod->symtab[best].st_name; return symname(mod, best); } /* For kallsyms to ask for address resolution. NULL means not found. Careful Loading Loading @@ -3542,8 +3547,7 @@ int module_get_kallsym(unsigned int symnum, unsigned long *value, char *type, if (symnum < mod->num_symtab) { *value = mod->symtab[symnum].st_value; *type = mod->symtab[symnum].st_info; strlcpy(name, mod->strtab + mod->symtab[symnum].st_name, KSYM_NAME_LEN); strlcpy(name, symname(mod, symnum), KSYM_NAME_LEN); strlcpy(module_name, mod->name, MODULE_NAME_LEN); *exported = is_exported(name, *value, mod); preempt_enable(); Loading @@ -3560,7 +3564,7 @@ static unsigned long mod_find_symname(struct module *mod, const char *name) unsigned int i; for (i = 0; i < mod->num_symtab; i++) if (strcmp(name, mod->strtab+mod->symtab[i].st_name) == 0 && if (strcmp(name, symname(mod, i)) == 0 && mod->symtab[i].st_info != 'U') return mod->symtab[i].st_value; return 0; Loading Loading @@ -3602,7 +3606,7 @@ int module_kallsyms_on_each_symbol(int (*fn)(void *, const char *, if (mod->state == MODULE_STATE_UNFORMED) continue; for (i = 0; i < mod->num_symtab; i++) { ret = fn(data, mod->strtab + mod->symtab[i].st_name, ret = fn(data, symname(mod, i), mod, mod->symtab[i].st_value); if (ret != 0) return ret; Loading Loading
kernel/module.c +15 −11 Original line number Diff line number Diff line Loading @@ -3403,6 +3403,11 @@ static inline int is_arm_mapping_symbol(const char *str) && (str[2] == '\0' || str[2] == '.'); } static const char *symname(struct module *mod, unsigned int symnum) { return mod->strtab + mod->symtab[symnum].st_name; } static const char *get_ksymbol(struct module *mod, unsigned long addr, unsigned long *size, Loading @@ -3425,15 +3430,15 @@ static const char *get_ksymbol(struct module *mod, /* We ignore unnamed symbols: they're uninformative * and inserted at a whim. */ if (*symname(mod, i) == '\0' || is_arm_mapping_symbol(symname(mod, i))) continue; if (mod->symtab[i].st_value <= addr && mod->symtab[i].st_value > mod->symtab[best].st_value && *(mod->strtab + mod->symtab[i].st_name) != '\0' && !is_arm_mapping_symbol(mod->strtab + mod->symtab[i].st_name)) && mod->symtab[i].st_value > mod->symtab[best].st_value) best = i; if (mod->symtab[i].st_value > addr && mod->symtab[i].st_value < nextval && *(mod->strtab + mod->symtab[i].st_name) != '\0' && !is_arm_mapping_symbol(mod->strtab + mod->symtab[i].st_name)) && mod->symtab[i].st_value < nextval) nextval = mod->symtab[i].st_value; } Loading @@ -3444,7 +3449,7 @@ static const char *get_ksymbol(struct module *mod, *size = nextval - mod->symtab[best].st_value; if (offset) *offset = addr - mod->symtab[best].st_value; return mod->strtab + mod->symtab[best].st_name; return symname(mod, best); } /* For kallsyms to ask for address resolution. NULL means not found. Careful Loading Loading @@ -3542,8 +3547,7 @@ int module_get_kallsym(unsigned int symnum, unsigned long *value, char *type, if (symnum < mod->num_symtab) { *value = mod->symtab[symnum].st_value; *type = mod->symtab[symnum].st_info; strlcpy(name, mod->strtab + mod->symtab[symnum].st_name, KSYM_NAME_LEN); strlcpy(name, symname(mod, symnum), KSYM_NAME_LEN); strlcpy(module_name, mod->name, MODULE_NAME_LEN); *exported = is_exported(name, *value, mod); preempt_enable(); Loading @@ -3560,7 +3564,7 @@ static unsigned long mod_find_symname(struct module *mod, const char *name) unsigned int i; for (i = 0; i < mod->num_symtab; i++) if (strcmp(name, mod->strtab+mod->symtab[i].st_name) == 0 && if (strcmp(name, symname(mod, i)) == 0 && mod->symtab[i].st_info != 'U') return mod->symtab[i].st_value; return 0; Loading Loading @@ -3602,7 +3606,7 @@ int module_kallsyms_on_each_symbol(int (*fn)(void *, const char *, if (mod->state == MODULE_STATE_UNFORMED) continue; for (i = 0; i < mod->num_symtab; i++) { ret = fn(data, mod->strtab + mod->symtab[i].st_name, ret = fn(data, symname(mod, i), mod, mod->symtab[i].st_value); if (ret != 0) return ret; Loading