modpost: Fix modpost's license checking V3
[pandora-kernel.git] / scripts / mod / modpost.c
index 413c536..a509ff8 100644 (file)
@@ -254,6 +254,28 @@ static enum export export_no(const char *s)
        return export_unknown;
 }
 
+static const char *sec_name(struct elf_info *elf, int secindex);
+
+#define strstarts(str, prefix) (strncmp(str, prefix, strlen(prefix)) == 0)
+
+static enum export export_from_secname(struct elf_info *elf, unsigned int sec)
+{
+       const char *secname = sec_name(elf, sec);
+
+       if (strstarts(secname, "___ksymtab+"))
+               return export_plain;
+       else if (strstarts(secname, "___ksymtab_unused+"))
+               return export_unused;
+       else if (strstarts(secname, "___ksymtab_gpl+"))
+               return export_gpl;
+       else if (strstarts(secname, "___ksymtab_unused_gpl+"))
+               return export_unused_gpl;
+       else if (strstarts(secname, "___ksymtab_gpl_future+"))
+               return export_gpl_future;
+       else
+               return export_unknown;
+}
+
 static enum export export_from_sec(struct elf_info *elf, unsigned int sec)
 {
        if (sec == elf->export_sec)
@@ -563,7 +585,12 @@ static void handle_modversions(struct module *mod, struct elf_info *info,
                               Elf_Sym *sym, const char *symname)
 {
        unsigned int crc;
-       enum export export = export_from_sec(info, get_secindex(info, sym));
+       enum export export;
+
+       if (!is_vmlinux(mod->name) && strncmp(symname, "__ksymtab", 9) == 0)
+               export = export_from_secname(info, get_secindex(info, sym));
+       else
+               export = export_from_sec(info, get_secindex(info, sym));
 
        switch (sym->st_shndx) {
        case SHN_COMMON: