diff options
author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-07-01 12:58:43 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-07-01 12:58:43 -0400 |
commit | b4bc7b53ccfa0cb793591ba11af49db8f1bc5a4d (patch) | |
tree | bb0d32d8c8a9d558794dbda60542beace0d2bcbc /scripts | |
parent | 0cadaf45bd7c19f0bef49d1eebfff38a046b9ba4 (diff) | |
parent | 701842e3bdd7db09db6af43fc5906ee19b61338d (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/sam/kbuild
* git://git.kernel.org/pub/scm/linux/kernel/git/sam/kbuild:
kbuild: documentation change on allowing checkers besides sparse
kbuild: warn when a moduled uses a symbol marked UNUSED
kbuild: fix segv in modpost
kconfig: enhancing accessibility of lxdialog
kbuild: fix ia64 breakage after introducing make -rR
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/Kbuild.include | 4 | ||||
-rw-r--r-- | scripts/Makefile.build | 2 | ||||
-rw-r--r-- | scripts/Makefile.host | 6 | ||||
-rw-r--r-- | scripts/Makefile.lib | 6 | ||||
-rw-r--r-- | scripts/Makefile.modpost | 2 | ||||
-rw-r--r-- | scripts/kconfig/lxdialog/checklist.c | 7 | ||||
-rw-r--r-- | scripts/mod/modpost.c | 94 | ||||
-rw-r--r-- | scripts/mod/modpost.h | 2 |
8 files changed, 88 insertions, 35 deletions
diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include index b0d067be7390..2180c88cfe89 100644 --- a/scripts/Kbuild.include +++ b/scripts/Kbuild.include | |||
@@ -13,6 +13,10 @@ space := $(empty) $(empty) | |||
13 | depfile = $(subst $(comma),_,$(@D)/.$(@F).d) | 13 | depfile = $(subst $(comma),_,$(@D)/.$(@F).d) |
14 | 14 | ||
15 | ### | 15 | ### |
16 | # filename of target with directory and extension stripped | ||
17 | basetarget = $(basename $(notdir $@)) | ||
18 | |||
19 | ### | ||
16 | # Escape single quote for use in echo statements | 20 | # Escape single quote for use in echo statements |
17 | escsq = $(subst $(squote),'\$(squote)',$1) | 21 | escsq = $(subst $(squote),'\$(squote)',$1) |
18 | 22 | ||
diff --git a/scripts/Makefile.build b/scripts/Makefile.build index 02a7eea5fdbc..3cb445cc7432 100644 --- a/scripts/Makefile.build +++ b/scripts/Makefile.build | |||
@@ -117,7 +117,7 @@ $(real-objs-m:.o=.lst): quiet_modtag := [M] | |||
117 | $(obj-m) : quiet_modtag := [M] | 117 | $(obj-m) : quiet_modtag := [M] |
118 | 118 | ||
119 | # Default for not multi-part modules | 119 | # Default for not multi-part modules |
120 | modname = $(*F) | 120 | modname = $(basetarget) |
121 | 121 | ||
122 | $(multi-objs-m) : modname = $(modname-multi) | 122 | $(multi-objs-m) : modname = $(modname-multi) |
123 | $(multi-objs-m:.o=.i) : modname = $(modname-multi) | 123 | $(multi-objs-m:.o=.i) : modname = $(modname-multi) |
diff --git a/scripts/Makefile.host b/scripts/Makefile.host index 2b066d12af2c..18ecd4d5df7f 100644 --- a/scripts/Makefile.host +++ b/scripts/Makefile.host | |||
@@ -80,8 +80,10 @@ obj-dirs += $(host-objdirs) | |||
80 | ##### | 80 | ##### |
81 | # Handle options to gcc. Support building with separate output directory | 81 | # Handle options to gcc. Support building with separate output directory |
82 | 82 | ||
83 | _hostc_flags = $(HOSTCFLAGS) $(HOST_EXTRACFLAGS) $(HOSTCFLAGS_$(*F).o) | 83 | _hostc_flags = $(HOSTCFLAGS) $(HOST_EXTRACFLAGS) \ |
84 | _hostcxx_flags = $(HOSTCXXFLAGS) $(HOST_EXTRACXXFLAGS) $(HOSTCXXFLAGS_$(*F).o) | 84 | $(HOSTCFLAGS_$(basetarget).o) |
85 | _hostcxx_flags = $(HOSTCXXFLAGS) $(HOST_EXTRACXXFLAGS) \ | ||
86 | $(HOSTCXXFLAGS_$(basetarget).o) | ||
85 | 87 | ||
86 | ifeq ($(KBUILD_SRC),) | 88 | ifeq ($(KBUILD_SRC),) |
87 | __hostc_flags = $(_hostc_flags) | 89 | __hostc_flags = $(_hostc_flags) |
diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib index 2cb4935e85d1..fc498fee68ed 100644 --- a/scripts/Makefile.lib +++ b/scripts/Makefile.lib | |||
@@ -82,12 +82,12 @@ obj-dirs := $(addprefix $(obj)/,$(obj-dirs)) | |||
82 | # than one module. In that case KBUILD_MODNAME will be set to foo_bar, | 82 | # than one module. In that case KBUILD_MODNAME will be set to foo_bar, |
83 | # where foo and bar are the name of the modules. | 83 | # where foo and bar are the name of the modules. |
84 | name-fix = $(subst $(comma),_,$(subst -,_,$1)) | 84 | name-fix = $(subst $(comma),_,$(subst -,_,$1)) |
85 | basename_flags = -D"KBUILD_BASENAME=KBUILD_STR($(call name-fix,$(*F)))" | 85 | basename_flags = -D"KBUILD_BASENAME=KBUILD_STR($(call name-fix,$(basetarget)))" |
86 | modname_flags = $(if $(filter 1,$(words $(modname))),\ | 86 | modname_flags = $(if $(filter 1,$(words $(modname))),\ |
87 | -D"KBUILD_MODNAME=KBUILD_STR($(call name-fix,$(modname)))") | 87 | -D"KBUILD_MODNAME=KBUILD_STR($(call name-fix,$(modname)))") |
88 | 88 | ||
89 | _c_flags = $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$(*F).o) | 89 | _c_flags = $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$(basetarget).o) |
90 | _a_flags = $(AFLAGS) $(EXTRA_AFLAGS) $(AFLAGS_$(*F).o) | 90 | _a_flags = $(AFLAGS) $(EXTRA_AFLAGS) $(AFLAGS_$(basetarget).o) |
91 | _cpp_flags = $(CPPFLAGS) $(EXTRA_CPPFLAGS) $(CPPFLAGS_$(@F)) | 91 | _cpp_flags = $(CPPFLAGS) $(EXTRA_CPPFLAGS) $(CPPFLAGS_$(@F)) |
92 | 92 | ||
93 | # If building the kernel in a separate objtree expand all occurrences | 93 | # If building the kernel in a separate objtree expand all occurrences |
diff --git a/scripts/Makefile.modpost b/scripts/Makefile.modpost index 576cce5e387f..a49550205dcc 100644 --- a/scripts/Makefile.modpost +++ b/scripts/Makefile.modpost | |||
@@ -72,7 +72,7 @@ $(modules:.ko=.mod.c): __modpost ; | |||
72 | # Step 5), compile all *.mod.c files | 72 | # Step 5), compile all *.mod.c files |
73 | 73 | ||
74 | # modname is set to make c_flags define KBUILD_MODNAME | 74 | # modname is set to make c_flags define KBUILD_MODNAME |
75 | modname = $(*F) | 75 | modname = $(notdir $(@:.mod.o=)) |
76 | 76 | ||
77 | quiet_cmd_cc_o_c = CC $@ | 77 | quiet_cmd_cc_o_c = CC $@ |
78 | cmd_cc_o_c = $(CC) $(c_flags) $(CFLAGS_MODULE) \ | 78 | cmd_cc_o_c = $(CC) $(c_flags) $(CFLAGS_MODULE) \ |
diff --git a/scripts/kconfig/lxdialog/checklist.c b/scripts/kconfig/lxdialog/checklist.c index be0200e9cdaf..79886413b6d5 100644 --- a/scripts/kconfig/lxdialog/checklist.c +++ b/scripts/kconfig/lxdialog/checklist.c | |||
@@ -187,9 +187,12 @@ int dialog_checklist(const char *title, const char *prompt, int height, | |||
187 | 187 | ||
188 | /* Print the list */ | 188 | /* Print the list */ |
189 | for (i = 0; i < max_choice; i++) { | 189 | for (i = 0; i < max_choice; i++) { |
190 | print_item(list, items[(scroll + i) * 3 + 1], | 190 | if (i != choice) |
191 | status[i + scroll], i, i == choice); | 191 | print_item(list, items[(scroll + i) * 3 + 1], |
192 | status[i + scroll], i, 0); | ||
192 | } | 193 | } |
194 | print_item(list, items[(scroll + choice) * 3 + 1], | ||
195 | status[choice + scroll], choice, 1); | ||
193 | 196 | ||
194 | print_arrows(dialog, choice, item_no, scroll, | 197 | print_arrows(dialog, choice, item_no, scroll, |
195 | box_y, box_x + check_x + 5, list_height); | 198 | box_y, box_x + check_x + 5, list_height); |
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index 0dd16177642d..dfde0e87a765 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c | |||
@@ -24,7 +24,10 @@ static int all_versions = 0; | |||
24 | /* If we are modposting external module set to 1 */ | 24 | /* If we are modposting external module set to 1 */ |
25 | static int external_module = 0; | 25 | static int external_module = 0; |
26 | /* How a symbol is exported */ | 26 | /* How a symbol is exported */ |
27 | enum export {export_plain, export_gpl, export_gpl_future, export_unknown}; | 27 | enum export { |
28 | export_plain, export_unused, export_gpl, | ||
29 | export_unused_gpl, export_gpl_future, export_unknown | ||
30 | }; | ||
28 | 31 | ||
29 | void fatal(const char *fmt, ...) | 32 | void fatal(const char *fmt, ...) |
30 | { | 33 | { |
@@ -191,7 +194,9 @@ static struct { | |||
191 | enum export export; | 194 | enum export export; |
192 | } export_list[] = { | 195 | } export_list[] = { |
193 | { .str = "EXPORT_SYMBOL", .export = export_plain }, | 196 | { .str = "EXPORT_SYMBOL", .export = export_plain }, |
197 | { .str = "EXPORT_UNUSED_SYMBOL", .export = export_unused }, | ||
194 | { .str = "EXPORT_SYMBOL_GPL", .export = export_gpl }, | 198 | { .str = "EXPORT_SYMBOL_GPL", .export = export_gpl }, |
199 | { .str = "EXPORT_UNUSED_SYMBOL_GPL", .export = export_unused_gpl }, | ||
195 | { .str = "EXPORT_SYMBOL_GPL_FUTURE", .export = export_gpl_future }, | 200 | { .str = "EXPORT_SYMBOL_GPL_FUTURE", .export = export_gpl_future }, |
196 | { .str = "(unknown)", .export = export_unknown }, | 201 | { .str = "(unknown)", .export = export_unknown }, |
197 | }; | 202 | }; |
@@ -205,6 +210,8 @@ static const char *export_str(enum export ex) | |||
205 | static enum export export_no(const char * s) | 210 | static enum export export_no(const char * s) |
206 | { | 211 | { |
207 | int i; | 212 | int i; |
213 | if (!s) | ||
214 | return export_unknown; | ||
208 | for (i = 0; export_list[i].export != export_unknown; i++) { | 215 | for (i = 0; export_list[i].export != export_unknown; i++) { |
209 | if (strcmp(export_list[i].str, s) == 0) | 216 | if (strcmp(export_list[i].str, s) == 0) |
210 | return export_list[i].export; | 217 | return export_list[i].export; |
@@ -216,8 +223,12 @@ static enum export export_from_sec(struct elf_info *elf, Elf_Section sec) | |||
216 | { | 223 | { |
217 | if (sec == elf->export_sec) | 224 | if (sec == elf->export_sec) |
218 | return export_plain; | 225 | return export_plain; |
226 | else if (sec == elf->export_unused_sec) | ||
227 | return export_unused; | ||
219 | else if (sec == elf->export_gpl_sec) | 228 | else if (sec == elf->export_gpl_sec) |
220 | return export_gpl; | 229 | return export_gpl; |
230 | else if (sec == elf->export_unused_gpl_sec) | ||
231 | return export_unused_gpl; | ||
221 | else if (sec == elf->export_gpl_future_sec) | 232 | else if (sec == elf->export_gpl_future_sec) |
222 | return export_gpl_future; | 233 | return export_gpl_future; |
223 | else | 234 | else |
@@ -366,8 +377,12 @@ static void parse_elf(struct elf_info *info, const char *filename) | |||
366 | info->modinfo_len = sechdrs[i].sh_size; | 377 | info->modinfo_len = sechdrs[i].sh_size; |
367 | } else if (strcmp(secname, "__ksymtab") == 0) | 378 | } else if (strcmp(secname, "__ksymtab") == 0) |
368 | info->export_sec = i; | 379 | info->export_sec = i; |
380 | else if (strcmp(secname, "__ksymtab_unused") == 0) | ||
381 | info->export_unused_sec = i; | ||
369 | else if (strcmp(secname, "__ksymtab_gpl") == 0) | 382 | else if (strcmp(secname, "__ksymtab_gpl") == 0) |
370 | info->export_gpl_sec = i; | 383 | info->export_gpl_sec = i; |
384 | else if (strcmp(secname, "__ksymtab_unused_gpl") == 0) | ||
385 | info->export_unused_gpl_sec = i; | ||
371 | else if (strcmp(secname, "__ksymtab_gpl_future") == 0) | 386 | else if (strcmp(secname, "__ksymtab_gpl_future") == 0) |
372 | info->export_gpl_future_sec = i; | 387 | info->export_gpl_future_sec = i; |
373 | 388 | ||
@@ -1085,38 +1100,64 @@ void buf_write(struct buffer *buf, const char *s, int len) | |||
1085 | buf->pos += len; | 1100 | buf->pos += len; |
1086 | } | 1101 | } |
1087 | 1102 | ||
1088 | void check_license(struct module *mod) | 1103 | static void check_for_gpl_usage(enum export exp, const char *m, const char *s) |
1104 | { | ||
1105 | const char *e = is_vmlinux(m) ?"":".ko"; | ||
1106 | |||
1107 | switch (exp) { | ||
1108 | case export_gpl: | ||
1109 | fatal("modpost: GPL-incompatible module %s%s " | ||
1110 | "uses GPL-only symbol '%s'\n", m, e, s); | ||
1111 | break; | ||
1112 | case export_unused_gpl: | ||
1113 | fatal("modpost: GPL-incompatible module %s%s " | ||
1114 | "uses GPL-only symbol marked UNUSED '%s'\n", m, e, s); | ||
1115 | break; | ||
1116 | case export_gpl_future: | ||
1117 | warn("modpost: GPL-incompatible module %s%s " | ||
1118 | "uses future GPL-only symbol '%s'\n", m, e, s); | ||
1119 | break; | ||
1120 | case export_plain: | ||
1121 | case export_unused: | ||
1122 | case export_unknown: | ||
1123 | /* ignore */ | ||
1124 | break; | ||
1125 | } | ||
1126 | } | ||
1127 | |||
1128 | static void check_for_unused(enum export exp, const char* m, const char* s) | ||
1129 | { | ||
1130 | const char *e = is_vmlinux(m) ?"":".ko"; | ||
1131 | |||
1132 | switch (exp) { | ||
1133 | case export_unused: | ||
1134 | case export_unused_gpl: | ||
1135 | warn("modpost: module %s%s " | ||
1136 | "uses symbol '%s' marked UNUSED\n", m, e, s); | ||
1137 | break; | ||
1138 | default: | ||
1139 | /* ignore */ | ||
1140 | break; | ||
1141 | } | ||
1142 | } | ||
1143 | |||
1144 | static void check_exports(struct module *mod) | ||
1089 | { | 1145 | { |
1090 | struct symbol *s, *exp; | 1146 | struct symbol *s, *exp; |
1091 | 1147 | ||
1092 | for (s = mod->unres; s; s = s->next) { | 1148 | for (s = mod->unres; s; s = s->next) { |
1093 | const char *basename; | 1149 | const char *basename; |
1094 | if (mod->gpl_compatible == 1) { | ||
1095 | /* GPL-compatible modules may use all symbols */ | ||
1096 | continue; | ||
1097 | } | ||
1098 | exp = find_symbol(s->name); | 1150 | exp = find_symbol(s->name); |
1099 | if (!exp || exp->module == mod) | 1151 | if (!exp || exp->module == mod) |
1100 | continue; | 1152 | continue; |
1101 | basename = strrchr(mod->name, '/'); | 1153 | basename = strrchr(mod->name, '/'); |
1102 | if (basename) | 1154 | if (basename) |
1103 | basename++; | 1155 | basename++; |
1104 | switch (exp->export) { | 1156 | else |
1105 | case export_gpl: | 1157 | basename = mod->name; |
1106 | fatal("modpost: GPL-incompatible module %s " | 1158 | if (!mod->gpl_compatible) |
1107 | "uses GPL-only symbol '%s'\n", | 1159 | check_for_gpl_usage(exp->export, basename, exp->name); |
1108 | basename ? basename : mod->name, | 1160 | check_for_unused(exp->export, basename, exp->name); |
1109 | exp->name); | ||
1110 | break; | ||
1111 | case export_gpl_future: | ||
1112 | warn("modpost: GPL-incompatible module %s " | ||
1113 | "uses future GPL-only symbol '%s'\n", | ||
1114 | basename ? basename : mod->name, | ||
1115 | exp->name); | ||
1116 | break; | ||
1117 | case export_plain: /* ignore */ break; | ||
1118 | case export_unknown: /* ignore */ break; | ||
1119 | } | ||
1120 | } | 1161 | } |
1121 | } | 1162 | } |
1122 | 1163 | ||
@@ -1271,7 +1312,7 @@ static void write_if_changed(struct buffer *b, const char *fname) | |||
1271 | } | 1312 | } |
1272 | 1313 | ||
1273 | /* parse Module.symvers file. line format: | 1314 | /* parse Module.symvers file. line format: |
1274 | * 0x12345678<tab>symbol<tab>module[<tab>export] | 1315 | * 0x12345678<tab>symbol<tab>module[[<tab>export]<tab>something] |
1275 | **/ | 1316 | **/ |
1276 | static void read_dump(const char *fname, unsigned int kernel) | 1317 | static void read_dump(const char *fname, unsigned int kernel) |
1277 | { | 1318 | { |
@@ -1284,7 +1325,7 @@ static void read_dump(const char *fname, unsigned int kernel) | |||
1284 | return; | 1325 | return; |
1285 | 1326 | ||
1286 | while ((line = get_next_line(&pos, file, size))) { | 1327 | while ((line = get_next_line(&pos, file, size))) { |
1287 | char *symname, *modname, *d, *export; | 1328 | char *symname, *modname, *d, *export, *end; |
1288 | unsigned int crc; | 1329 | unsigned int crc; |
1289 | struct module *mod; | 1330 | struct module *mod; |
1290 | struct symbol *s; | 1331 | struct symbol *s; |
@@ -1297,7 +1338,8 @@ static void read_dump(const char *fname, unsigned int kernel) | |||
1297 | *modname++ = '\0'; | 1338 | *modname++ = '\0'; |
1298 | if ((export = strchr(modname, '\t')) != NULL) | 1339 | if ((export = strchr(modname, '\t')) != NULL) |
1299 | *export++ = '\0'; | 1340 | *export++ = '\0'; |
1300 | 1341 | if (export && ((end = strchr(export, '\t')) != NULL)) | |
1342 | *end = '\0'; | ||
1301 | crc = strtoul(line, &d, 16); | 1343 | crc = strtoul(line, &d, 16); |
1302 | if (*symname == '\0' || *modname == '\0' || *d != '\0') | 1344 | if (*symname == '\0' || *modname == '\0' || *d != '\0') |
1303 | goto fail; | 1345 | goto fail; |
@@ -1396,7 +1438,7 @@ int main(int argc, char **argv) | |||
1396 | for (mod = modules; mod; mod = mod->next) { | 1438 | for (mod = modules; mod; mod = mod->next) { |
1397 | if (mod->skip) | 1439 | if (mod->skip) |
1398 | continue; | 1440 | continue; |
1399 | check_license(mod); | 1441 | check_exports(mod); |
1400 | } | 1442 | } |
1401 | 1443 | ||
1402 | for (mod = modules; mod; mod = mod->next) { | 1444 | for (mod = modules; mod; mod = mod->next) { |
diff --git a/scripts/mod/modpost.h b/scripts/mod/modpost.h index 2b00c6062844..d398c61e55ef 100644 --- a/scripts/mod/modpost.h +++ b/scripts/mod/modpost.h | |||
@@ -117,7 +117,9 @@ struct elf_info { | |||
117 | Elf_Sym *symtab_start; | 117 | Elf_Sym *symtab_start; |
118 | Elf_Sym *symtab_stop; | 118 | Elf_Sym *symtab_stop; |
119 | Elf_Section export_sec; | 119 | Elf_Section export_sec; |
120 | Elf_Section export_unused_sec; | ||
120 | Elf_Section export_gpl_sec; | 121 | Elf_Section export_gpl_sec; |
122 | Elf_Section export_unused_gpl_sec; | ||
121 | Elf_Section export_gpl_future_sec; | 123 | Elf_Section export_gpl_future_sec; |
122 | const char *strtab; | 124 | const char *strtab; |
123 | char *modinfo; | 125 | char *modinfo; |