Re: [PATCH] fix for kallsyms module symbol resolution problem

From: James Bottomley (James.Bottomley@steeleye.com)
Date: Mon Jun 30 2003 - 21:24:35 EST


On Mon, 2003-06-30 at 01:17, Rusty Russell wrote:
> Yeah, but I was trying to get you to do more work. And if the names
> resulting are useless anyway, why apply the patch?

OK, how about the attached. I think it solves the module_text_address()
problem too.

James


===== 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;
 }

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Mon Jun 30 2003 - 22:00:35 EST