lkml.org 
[lkml]   [2002]   [Dec]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    SubjectRe: [BUG][2.5.50] kallsyms dies badly with module
    Date
    In message <Pine.LNX.4.50.0211291105440.14410-100000@montezuma.mastecende.com> 
    you write:
    > Hi Rusty,
    > If kallsyms_lookup tries to get a symbol from tiglusb.c loaded as
    > a module it oopses.

    Yes, see kallsyms fix patch (attached for your convenience). I was
    keeping the wrong module section 8(

    Hope this helps,
    Rusty.
    --
    Anyone who quotes me in their sig is an idiot. -- Rusty Russell.

    Name: Kallsyms inside module fix
    Author: Rusty Russell
    Status: Tested on 2.5.50

    D: Two fixes. Firstly, set ALLOC on the right section so we actually
    D: keep the symbol names and don't deref a freed section, and secondly
    D: get the symbol size (more) correct.

    diff -urNp --exclude TAGS -X /home/rusty/current-dontdiff --minimal linux-2.5.50/kernel/module.c working-2.5.50-ksymoops/kernel/module.c
    --- linux-2.5.50/kernel/module.c Mon Nov 25 08:44:19 2002
    +++ working-2.5.50-ksymoops/kernel/module.c Thu Nov 28 16:22:56 2002
    @@ -892,7 +892,7 @@ static struct module *load_module(void *
    }
    #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 mo
    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 +1186,14 @@ static const char *get_ksymbol(struct mo
    && 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;
    }
    -
    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/
    \
     
     \ /
      Last update: 2005-03-22 13:31    [W:0.023 / U:0.144 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site