diff options
| author | Rusty Russell <rusty@rustcorp.com.au> | 2002-12-01 02:12:36 -0800 |
|---|---|---|
| committer | James Bottomley <jejb@raven.il.steeleye.com> | 2002-12-01 02:12:36 -0800 |
| commit | 1929e8b2a804ea760ef1dba27f26d62d6236dd65 (patch) | |
| tree | efbf15122efcce5f95d025f264d60ccad2f2faa3 /kernel/module.c | |
| parent | 5be91439ee400119cbc60a0e27be085c5d90476d (diff) | |
[PATCH] kallsyms in modules fix
Two fixes. Firstly, set ALLOC on the right section so we actually
keep the symbol names and don't deref a freed section, and secondly
get the symbol size (more) correct.
Diffstat (limited to 'kernel/module.c')
| -rw-r--r-- | kernel/module.c | 25 |
1 files changed, 12 insertions, 13 deletions
diff --git a/kernel/module.c b/kernel/module.c index f9ee37c95dbe..9ee9bf6411ad 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -892,7 +892,7 @@ static struct module *load_module(void *umod, } #ifdef CONFIG_KALLSYMS /* symbol and string tables for decoding later. */ - if (sechdrs[i].sh_type == SHT_SYMTAB || i == hdr->e_shstrndx) + if (sechdrs[i].sh_type == SHT_SYMTAB || i == strindex) sechdrs[i].sh_flags |= SHF_ALLOC; #endif #ifndef CONFIG_MODULE_UNLOAD @@ -1165,7 +1165,14 @@ static const char *get_ksymbol(struct module *mod, unsigned long *size, unsigned long *offset) { - unsigned int i, next = 0, best = 0; + unsigned int i, best = 0; + unsigned long nextval; + + /* At worse, next value is at end of module */ + if (inside_core(mod, addr)) + nextval = (unsigned long)mod->module_core+mod->core_size; + else + nextval = (unsigned long)mod->module_init+mod->init_size; /* Scan for closest preceeding symbol, and next symbol. (ELF starts real symbols at 1). */ @@ -1177,22 +1184,14 @@ static const char *get_ksymbol(struct module *mod, && mod->symtab[i].st_value > mod->symtab[best].st_value) best = i; if (mod->symtab[i].st_value > addr - && mod->symtab[i].st_value < mod->symtab[next].st_value) - next = i; + && mod->symtab[i].st_value < nextval) + nextval = mod->symtab[i].st_value; } if (!best) return NULL; - if (!next) { - /* Last symbol? It ends at the end of the module then. */ - if (inside_core(mod, addr)) - *size = mod->module_core+mod->core_size - (void*)addr; - else - *size = mod->module_init+mod->init_size - (void*)addr; - } else - *size = mod->symtab[next].st_value - addr; - + *size = nextval - mod->symtab[best].st_value; *offset = addr - mod->symtab[best].st_value; return mod->strtab + mod->symtab[best].st_name; } |
