===== include/linux/module.h 1.65 vs edited ===== --- 1.65/include/linux/module.h Fri Jun 6 00:54:38 2003 +++ edited/include/linux/module.h Mon Jun 30 15:47:27 2003 @@ -217,6 +217,9 @@ /* Here are the sizes of the init and core sections */ unsigned long init_size, core_size; + /* The size of the code in each section. */ + unsigned long init_code_size, core_code_size; + /* Arch-specific module values */ struct mod_arch_specific arch; ===== kernel/module.c 1.86 vs edited ===== --- 1.86/kernel/module.c Wed Jun 11 00:55:09 2003 +++ edited/kernel/module.c Mon Jun 30 21:18:17 2003 @@ -1176,6 +1176,9 @@ const char *secstrings) { static unsigned long const masks[][2] = { + /* NOTE: code must be the first and only section + * in this array; otherwise modify the code_size + * finder in the two loops below */ { SHF_EXECINSTR | SHF_ALLOC, ARCH_SHF_SMALL }, { SHF_ALLOC, SHF_WRITE | ARCH_SHF_SMALL }, { SHF_WRITE | SHF_ALLOC, ARCH_SHF_SMALL }, @@ -1198,6 +1201,8 @@ continue; s->sh_entsize = get_offset(&mod->core_size, s); DEBUGP("\t%s\n", secstrings + s->sh_name); + if(m == 0) + mod->core_code_size = mod->core_size; } } @@ -1214,6 +1219,8 @@ s->sh_entsize = (get_offset(&mod->init_size, s) | INIT_OFFSET_MASK); DEBUGP("\t%s\n", secstrings + s->sh_name); + if(m == 0) + mod->init_code_size = mod->init_size; } } } @@ -1726,6 +1733,7 @@ module_free(mod, mod->module_init); mod->module_init = NULL; mod->init_size = 0; + mod->init_code_size = 0; up(&module_mutex); return 0; @@ -1747,9 +1755,11 @@ /* At worse, next value is at end of module */ if (within(addr, mod->module_init, mod->init_size)) - nextval = (unsigned long)mod->module_init + mod->init_size; + nextval = (unsigned long)mod->module_init + + mod->init_code_size; else - nextval = (unsigned long)mod->module_core + mod->core_size; + nextval = (unsigned long)mod->module_core + + mod->core_code_size; /* Scan for closest preceeding symbol, and next symbol. (ELF starts real symbols at 1). */ @@ -1758,10 +1768,12 @@ continue; if (mod->symtab[i].st_value <= addr - && mod->symtab[i].st_value > mod->symtab[best].st_value) + && mod->symtab[i].st_value > mod->symtab[best].st_value + && *(mod->strtab + mod->symtab[i].st_name) != '\0' ) best = i; if (mod->symtab[i].st_value > addr - && mod->symtab[i].st_value < nextval) + && mod->symtab[i].st_value < nextval + && *(mod->strtab + mod->symtab[i].st_name) != '\0') nextval = mod->symtab[i].st_value; } @@ -1910,8 +1922,8 @@ struct module *mod; list_for_each_entry(mod, &modules, list) - if (within(addr, mod->module_init, mod->init_size) - || within(addr, mod->module_core, mod->core_size)) + if (within(addr, mod->module_init, mod->init_code_size) + || within(addr, mod->module_core, mod->core_code_size)) return mod; return NULL; }