Adding Rusty and Michal to CC.

On Tue, Mar 17, 2015 at 01:39:58PM +0100, Quentin Casasnovas wrote:
> This will be useful when we want to have special handlers which need to go
> through more hops to print useful information to the user.
> 
> Signed-off-by: Quentin Casasnovas <[email protected]>
> ---
>  scripts/mod/modpost.c | 68 
> +++++++++++++++++++++++++++++++--------------------
>  1 file changed, 42 insertions(+), 26 deletions(-)
> 
> diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
> index 8cef46b..0f48f8b 100644
> --- a/scripts/mod/modpost.c
> +++ b/scripts/mod/modpost.c
> @@ -930,6 +930,10 @@ struct sectioncheck {
>       const char *good_tosec[20];
>       enum mismatch mismatch;
>       const char *symbol_white_list[20];
> +     void (*handler)(const char *modname, struct elf_info *elf,
> +                     const struct sectioncheck* const mismatch,
> +                     Elf_Rela *r, Elf_Sym *sym, const char *fromsec);
> +
>  };
>  
>  static const struct sectioncheck sectioncheck[] = {
> @@ -1417,37 +1421,49 @@ static void report_sec_mismatch(const char *modname,
>       fprintf(stderr, "\n");
>  }
>  
> -static void check_section_mismatch(const char *modname, struct elf_info *elf,
> -                                Elf_Rela *r, Elf_Sym *sym, const char 
> *fromsec)
> +static void default_mismatch_handler(const char *modname, struct elf_info 
> *elf,
> +                                  const struct sectioncheck* const mismatch,
> +                                  Elf_Rela *r, Elf_Sym *sym, const char 
> *fromsec)
>  {
>       const char *tosec;
> -     const struct sectioncheck *mismatch;
> +     Elf_Sym *to;
> +     Elf_Sym *from;
> +     const char *tosym;
> +     const char *fromsym;
>  
>       tosec = sec_name(elf, get_secindex(elf, sym));
> -     mismatch = section_mismatch(fromsec, tosec);
> +     from = find_elf_symbol2(elf, r->r_offset, fromsec);
> +     fromsym = sym_name(elf, from);
> +     to = find_elf_symbol(elf, r->r_addend, sym);
> +     tosym = sym_name(elf, to);
> +
> +     if (!strncmp(fromsym, "reference___initcall",
> +                  sizeof("reference___initcall")-1))
> +             return;
> +
> +     /* check whitelist - we may ignore it */
> +     if (secref_whitelist(mismatch,
> +                          fromsec, fromsym, tosec, tosym)) {
> +             report_sec_mismatch(modname, mismatch,
> +                                 fromsec, r->r_offset, fromsym,
> +                                 is_function(from), tosec, tosym,
> +                                 is_function(to));
> +     }
> +}
> +
> +static void check_section_mismatch(const char *modname, struct elf_info *elf,
> +                                Elf_Rela *r, Elf_Sym *sym, const char 
> *fromsec)
> +{
> +     const char *tosec = sec_name(elf, get_secindex(elf, sym));;
> +     const struct sectioncheck *mismatch = section_mismatch(fromsec, tosec);
> +
>       if (mismatch) {
> -             Elf_Sym *to;
> -             Elf_Sym *from;
> -             const char *tosym;
> -             const char *fromsym;
> -
> -             from = find_elf_symbol2(elf, r->r_offset, fromsec);
> -             fromsym = sym_name(elf, from);
> -             to = find_elf_symbol(elf, r->r_addend, sym);
> -             tosym = sym_name(elf, to);
> -
> -             if (!strncmp(fromsym, "reference___initcall",
> -                             sizeof("reference___initcall")-1))
> -                     return;
> -
> -             /* check whitelist - we may ignore it */
> -             if (secref_whitelist(mismatch,
> -                                     fromsec, fromsym, tosec, tosym)) {
> -                     report_sec_mismatch(modname, mismatch,
> -                        fromsec, r->r_offset, fromsym,
> -                        is_function(from), tosec, tosym,
> -                        is_function(to));
> -             }
> +             if (mismatch->handler)
> +                     mismatch->handler(modname, elf,  mismatch,
> +                                       r, sym, fromsec);
> +             else
> +                     default_mismatch_handler(modname, elf, mismatch,
> +                                              r, sym, fromsec);
>       }
>  }
>  
> -- 
> 2.0.5
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to