X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=scripts%2Fmod%2Fmodpost.c;h=d0f86ed43f7a17156953d889df8cfa00f6013b04;hb=9464c7cf61b9433057924c36e6e02f303a00e768;hp=dfde0e87a765e2e53c55f82fd505f22e76523999;hpb=41689045f6a3cbe0550e1d34e9cc20d2e8c432ba;p=linux-2.6.git diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index dfde0e87a..d0f86ed43 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c @@ -13,7 +13,6 @@ #include #include "modpost.h" -#include "../../include/linux/license.h" /* Are we using CONFIG_MODVERSIONS? */ int modversions = 0; @@ -23,11 +22,6 @@ int have_vmlinux = 0; static int all_versions = 0; /* If we are modposting external module set to 1 */ static int external_module = 0; -/* How a symbol is exported */ -enum export { - export_plain, export_unused, export_gpl, - export_unused_gpl, export_gpl_future, export_unknown -}; void fatal(const char *fmt, ...) { @@ -103,7 +97,6 @@ static struct module *new_module(char *modname) /* add to list */ mod->name = p; - mod->gpl_compatible = -1; mod->next = modules; modules = mod; @@ -125,7 +118,6 @@ struct symbol { unsigned int kernel:1; /* 1 if symbol is from kernel * (only for external modules) **/ unsigned int preloaded:1; /* 1 if symbol from Module.symvers */ - enum export export; /* Type of export */ char name[0]; }; @@ -161,8 +153,7 @@ static struct symbol *alloc_symbol(const char *name, unsigned int weak, } /* For the hash of exported symbols */ -static struct symbol *new_symbol(const char *name, struct module *module, - enum export export) +static struct symbol *new_symbol(const char *name, struct module *module) { unsigned int hash; struct symbol *new; @@ -170,7 +161,6 @@ static struct symbol *new_symbol(const char *name, struct module *module, hash = tdb_hash(name) % SYMBOL_HASH_SIZE; new = symbolhash[hash] = alloc_symbol(name, 0, symbolhash[hash]); new->module = module; - new->export = export; return new; } @@ -189,63 +179,16 @@ static struct symbol *find_symbol(const char *name) return NULL; } -static struct { - const char *str; - enum export export; -} export_list[] = { - { .str = "EXPORT_SYMBOL", .export = export_plain }, - { .str = "EXPORT_UNUSED_SYMBOL", .export = export_unused }, - { .str = "EXPORT_SYMBOL_GPL", .export = export_gpl }, - { .str = "EXPORT_UNUSED_SYMBOL_GPL", .export = export_unused_gpl }, - { .str = "EXPORT_SYMBOL_GPL_FUTURE", .export = export_gpl_future }, - { .str = "(unknown)", .export = export_unknown }, -}; - - -static const char *export_str(enum export ex) -{ - return export_list[ex].str; -} - -static enum export export_no(const char * s) -{ - int i; - if (!s) - return export_unknown; - for (i = 0; export_list[i].export != export_unknown; i++) { - if (strcmp(export_list[i].str, s) == 0) - return export_list[i].export; - } - return export_unknown; -} - -static enum export export_from_sec(struct elf_info *elf, Elf_Section sec) -{ - if (sec == elf->export_sec) - return export_plain; - else if (sec == elf->export_unused_sec) - return export_unused; - else if (sec == elf->export_gpl_sec) - return export_gpl; - else if (sec == elf->export_unused_gpl_sec) - return export_unused_gpl; - else if (sec == elf->export_gpl_future_sec) - return export_gpl_future; - else - return export_unknown; -} - /** * Add an exported symbol - it may have already been added without a * CRC, in this case just update the CRC **/ -static struct symbol *sym_add_exported(const char *name, struct module *mod, - enum export export) +static struct symbol *sym_add_exported(const char *name, struct module *mod) { struct symbol *s = find_symbol(name); if (!s) { - s = new_symbol(name, mod, export); + s = new_symbol(name, mod); } else { if (!s->preloaded) { warn("%s: '%s' exported twice. Previous export " @@ -257,17 +200,16 @@ static struct symbol *sym_add_exported(const char *name, struct module *mod, s->preloaded = 0; s->vmlinux = is_vmlinux(mod->name); s->kernel = 0; - s->export = export; return s; } static void sym_update_crc(const char *name, struct module *mod, - unsigned int crc, enum export export) + unsigned int crc) { struct symbol *s = find_symbol(name); if (!s) - s = new_symbol(name, mod, export); + s = new_symbol(name, mod); s->crc = crc; s->crc_valid = 1; } @@ -341,7 +283,7 @@ static void parse_elf(struct elf_info *info, const char *filename) hdr = grab_file(filename, &info->size); if (!hdr) { perror(filename); - exit(1); + abort(); } info->hdr = hdr; if (info->size < sizeof(*hdr)) @@ -367,25 +309,13 @@ static void parse_elf(struct elf_info *info, const char *filename) for (i = 1; i < hdr->e_shnum; i++) { const char *secstrings = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; - const char *secname; if (sechdrs[i].sh_offset > info->size) goto truncated; - secname = secstrings + sechdrs[i].sh_name; - if (strcmp(secname, ".modinfo") == 0) { + if (strcmp(secstrings+sechdrs[i].sh_name, ".modinfo") == 0) { info->modinfo = (void *)hdr + sechdrs[i].sh_offset; info->modinfo_len = sechdrs[i].sh_size; - } else if (strcmp(secname, "__ksymtab") == 0) - info->export_sec = i; - else if (strcmp(secname, "__ksymtab_unused") == 0) - info->export_unused_sec = i; - else if (strcmp(secname, "__ksymtab_gpl") == 0) - info->export_gpl_sec = i; - else if (strcmp(secname, "__ksymtab_unused_gpl") == 0) - info->export_unused_gpl_sec = i; - else if (strcmp(secname, "__ksymtab_gpl_future") == 0) - info->export_gpl_future_sec = i; - + } if (sechdrs[i].sh_type != SHT_SYMTAB) continue; @@ -423,7 +353,6 @@ 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, sym->st_shndx); switch (sym->st_shndx) { case SHN_COMMON: @@ -433,8 +362,7 @@ static void handle_modversions(struct module *mod, struct elf_info *info, /* CRC'd symbol */ if (memcmp(symname, CRC_PFX, strlen(CRC_PFX)) == 0) { crc = (unsigned int) sym->st_value; - sym_update_crc(symname + strlen(CRC_PFX), mod, crc, - export); + sym_update_crc(symname + strlen(CRC_PFX), mod, crc); } break; case SHN_UNDEF: @@ -478,8 +406,7 @@ static void handle_modversions(struct module *mod, struct elf_info *info, default: /* All exported symbols */ if (memcmp(symname, KSYMTAB_PFX, strlen(KSYMTAB_PFX)) == 0) { - sym_add_exported(symname + strlen(KSYMTAB_PFX), mod, - export); + sym_add_exported(symname + strlen(KSYMTAB_PFX), mod); } if (strcmp(symname, MODULE_SYMBOL_PREFIX "init_module") == 0) mod->has_init = 1; @@ -510,18 +437,13 @@ static char *next_string(char *string, unsigned long *secsize) return string; } -static char *get_next_modinfo(void *modinfo, unsigned long modinfo_len, - const char *tag, char *info) +static char *get_modinfo(void *modinfo, unsigned long modinfo_len, + const char *tag) { char *p; unsigned int taglen = strlen(tag); unsigned long size = modinfo_len; - if (info) { - size -= info - (char *)modinfo; - modinfo = next_string(info, &size); - } - for (p = modinfo; p; p = next_string(p, &size)) { if (strncmp(p, tag, taglen) == 0 && p[taglen] == '=') return p + taglen + 1; @@ -529,13 +451,6 @@ static char *get_next_modinfo(void *modinfo, unsigned long modinfo_len, return NULL; } -static char *get_modinfo(void *modinfo, unsigned long modinfo_len, - const char *tag) - -{ - return get_next_modinfo(modinfo, modinfo_len, tag, NULL); -} - /** * Test if string s ends in string sub * return 0 if match @@ -906,10 +821,6 @@ static int init_section_ref_ok(const char *name) ".pci_fixup_final", ".pdr", "__param", - "__ex_table", - ".fixup", - ".smp_locks", - ".plt", /* seen on ARCH=um build on x86_64. Harmless */ NULL }; /* Start of section names */ @@ -935,8 +846,6 @@ static int init_section_ref_ok(const char *name) for (s = namelist3; *s; s++) if (strstr(name, *s) != NULL) return 1; - if (strrcmp(name, ".init") == 0) - return 1; return 0; } @@ -983,10 +892,6 @@ static int exit_section_ref_ok(const char *name) ".exitcall.exit", ".eh_frame", ".stab", - "__ex_table", - ".fixup", - ".smp_locks", - ".plt", /* seen on ARCH=um build on x86_64. Harmless */ NULL }; /* Start of section names */ @@ -1016,7 +921,6 @@ static void read_symbols(char *modname) { const char *symname; char *version; - char *license; struct module *mod; struct elf_info info = { }; Elf_Sym *sym; @@ -1032,18 +936,6 @@ static void read_symbols(char *modname) mod->skip = 1; } - license = get_modinfo(info.modinfo, info.modinfo_len, "license"); - while (license) { - if (license_is_gpl_compatible(license)) - mod->gpl_compatible = 1; - else { - mod->gpl_compatible = 0; - break; - } - license = get_next_modinfo(info.modinfo, info.modinfo_len, - "license", license); - } - for (sym = info.symtab_start; sym < info.symtab_stop; sym++) { symname = info.strtab + sym->st_name; @@ -1100,67 +992,6 @@ void buf_write(struct buffer *buf, const char *s, int len) buf->pos += len; } -static void check_for_gpl_usage(enum export exp, const char *m, const char *s) -{ - const char *e = is_vmlinux(m) ?"":".ko"; - - switch (exp) { - case export_gpl: - fatal("modpost: GPL-incompatible module %s%s " - "uses GPL-only symbol '%s'\n", m, e, s); - break; - case export_unused_gpl: - fatal("modpost: GPL-incompatible module %s%s " - "uses GPL-only symbol marked UNUSED '%s'\n", m, e, s); - break; - case export_gpl_future: - warn("modpost: GPL-incompatible module %s%s " - "uses future GPL-only symbol '%s'\n", m, e, s); - break; - case export_plain: - case export_unused: - case export_unknown: - /* ignore */ - break; - } -} - -static void check_for_unused(enum export exp, const char* m, const char* s) -{ - const char *e = is_vmlinux(m) ?"":".ko"; - - switch (exp) { - case export_unused: - case export_unused_gpl: - warn("modpost: module %s%s " - "uses symbol '%s' marked UNUSED\n", m, e, s); - break; - default: - /* ignore */ - break; - } -} - -static void check_exports(struct module *mod) -{ - struct symbol *s, *exp; - - for (s = mod->unres; s; s = s->next) { - const char *basename; - exp = find_symbol(s->name); - if (!exp || exp->module == mod) - continue; - basename = strrchr(mod->name, '/'); - if (basename) - basename++; - else - basename = mod->name; - if (!mod->gpl_compatible) - check_for_gpl_usage(exp->export, basename, exp->name); - check_for_unused(exp->export, basename, exp->name); - } -} - /** * Header for the generated file **/ @@ -1311,9 +1142,6 @@ static void write_if_changed(struct buffer *b, const char *fname) fclose(file); } -/* parse Module.symvers file. line format: - * 0x12345678symbolmodule[[export]something] - **/ static void read_dump(const char *fname, unsigned int kernel) { unsigned long size, pos = 0; @@ -1325,7 +1153,7 @@ static void read_dump(const char *fname, unsigned int kernel) return; while ((line = get_next_line(&pos, file, size))) { - char *symname, *modname, *d, *export, *end; + char *symname, *modname, *d; unsigned int crc; struct module *mod; struct symbol *s; @@ -1336,10 +1164,8 @@ static void read_dump(const char *fname, unsigned int kernel) if (!(modname = strchr(symname, '\t'))) goto fail; *modname++ = '\0'; - if ((export = strchr(modname, '\t')) != NULL) - *export++ = '\0'; - if (export && ((end = strchr(export, '\t')) != NULL)) - *end = '\0'; + if (strchr(modname, '\t')) + goto fail; crc = strtoul(line, &d, 16); if (*symname == '\0' || *modname == '\0' || *d != '\0') goto fail; @@ -1351,10 +1177,10 @@ static void read_dump(const char *fname, unsigned int kernel) mod = new_module(NOFAIL(strdup(modname))); mod->skip = 1; } - s = sym_add_exported(symname, mod, export_no(export)); + s = sym_add_exported(symname, mod); s->kernel = kernel; s->preloaded = 1; - sym_update_crc(symname, mod, crc, export_no(export)); + sym_update_crc(symname, mod, crc); } return; fail: @@ -1384,10 +1210,9 @@ static void write_dump(const char *fname) symbol = symbolhash[n]; while (symbol) { if (dump_sym(symbol)) - buf_printf(&buf, "0x%08x\t%s\t%s\t%s\n", + buf_printf(&buf, "0x%08x\t%s\t%s\n", symbol->crc, symbol->name, - symbol->module->name, - export_str(symbol->export)); + symbol->module->name); symbol = symbol->next; } } @@ -1435,12 +1260,6 @@ int main(int argc, char **argv) read_symbols(argv[optind++]); } - for (mod = modules; mod; mod = mod->next) { - if (mod->skip) - continue; - check_exports(mod); - } - for (mod = modules; mod; mod = mod->next) { if (mod->skip) continue;