Commit c53ddacdc08d41f812f1e637d214251d14c07a3d
Committed by
Sam Ravnborg
1 parent
2212692913
Exists in
master
and in
4 other branches
kbuild: fail kernel compilation in case of unresolved module symbols
At stage 2 modpost utility is used to check modules. In case of unresolved symbols modpost only prints warning. IMHO it is a good idea to fail compilation process in case of unresolved symbols (at least in modules coming with kernel), since usually such errors are left unnoticed, but kernel modules are broken. - new option '-w' is added to modpost: if option is specified, modpost only warns about unresolved symbols - modpost is called with '-w' for external modules in Makefile.modpost Signed-off-by: Andrey Mirkin <amirkin@sw.ru> Signed-off-by: Kirill Korotaev <dev@openvz.org> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
Showing 2 changed files with 20 additions and 6 deletions Side-by-side Diff
scripts/Makefile.modpost
scripts/mod/modpost.c
... | ... | @@ -23,6 +23,8 @@ |
23 | 23 | static int all_versions = 0; |
24 | 24 | /* If we are modposting external module set to 1 */ |
25 | 25 | static int external_module = 0; |
26 | +/* Only warn about unresolved symbols */ | |
27 | +static int warn_unresolved = 0; | |
26 | 28 | /* How a symbol is exported */ |
27 | 29 | enum export { |
28 | 30 | export_plain, export_unused, export_gpl, |
29 | 31 | |
30 | 32 | |
31 | 33 | |
... | ... | @@ -1196,16 +1198,19 @@ |
1196 | 1198 | /** |
1197 | 1199 | * Record CRCs for unresolved symbols |
1198 | 1200 | **/ |
1199 | -static void add_versions(struct buffer *b, struct module *mod) | |
1201 | +static int add_versions(struct buffer *b, struct module *mod) | |
1200 | 1202 | { |
1201 | 1203 | struct symbol *s, *exp; |
1204 | + int err = 0; | |
1202 | 1205 | |
1203 | 1206 | for (s = mod->unres; s; s = s->next) { |
1204 | 1207 | exp = find_symbol(s->name); |
1205 | 1208 | if (!exp || exp->module == mod) { |
1206 | - if (have_vmlinux && !s->weak) | |
1209 | + if (have_vmlinux && !s->weak) { | |
1207 | 1210 | warn("\"%s\" [%s.ko] undefined!\n", |
1208 | 1211 | s->name, mod->name); |
1212 | + err = warn_unresolved ? 0 : 1; | |
1213 | + } | |
1209 | 1214 | continue; |
1210 | 1215 | } |
1211 | 1216 | s->module = exp->module; |
... | ... | @@ -1214,7 +1219,7 @@ |
1214 | 1219 | } |
1215 | 1220 | |
1216 | 1221 | if (!modversions) |
1217 | - return; | |
1222 | + return err; | |
1218 | 1223 | |
1219 | 1224 | buf_printf(b, "\n"); |
1220 | 1225 | buf_printf(b, "static const struct modversion_info ____versions[]\n"); |
... | ... | @@ -1234,6 +1239,8 @@ |
1234 | 1239 | } |
1235 | 1240 | |
1236 | 1241 | buf_printf(b, "};\n"); |
1242 | + | |
1243 | + return err; | |
1237 | 1244 | } |
1238 | 1245 | |
1239 | 1246 | static void add_depends(struct buffer *b, struct module *mod, |
1240 | 1247 | |
... | ... | @@ -1411,8 +1418,9 @@ |
1411 | 1418 | char *kernel_read = NULL, *module_read = NULL; |
1412 | 1419 | char *dump_write = NULL; |
1413 | 1420 | int opt; |
1421 | + int err; | |
1414 | 1422 | |
1415 | - while ((opt = getopt(argc, argv, "i:I:mo:a")) != -1) { | |
1423 | + while ((opt = getopt(argc, argv, "i:I:mo:aw")) != -1) { | |
1416 | 1424 | switch(opt) { |
1417 | 1425 | case 'i': |
1418 | 1426 | kernel_read = optarg; |
... | ... | @@ -1430,6 +1438,9 @@ |
1430 | 1438 | case 'a': |
1431 | 1439 | all_versions = 1; |
1432 | 1440 | break; |
1441 | + case 'w': | |
1442 | + warn_unresolved = 1; | |
1443 | + break; | |
1433 | 1444 | default: |
1434 | 1445 | exit(1); |
1435 | 1446 | } |
... | ... | @@ -1450,6 +1461,8 @@ |
1450 | 1461 | check_exports(mod); |
1451 | 1462 | } |
1452 | 1463 | |
1464 | + err = 0; | |
1465 | + | |
1453 | 1466 | for (mod = modules; mod; mod = mod->next) { |
1454 | 1467 | if (mod->skip) |
1455 | 1468 | continue; |
... | ... | @@ -1457,7 +1470,7 @@ |
1457 | 1470 | buf.pos = 0; |
1458 | 1471 | |
1459 | 1472 | add_header(&buf, mod); |
1460 | - add_versions(&buf, mod); | |
1473 | + err |= add_versions(&buf, mod); | |
1461 | 1474 | add_depends(&buf, mod, modules); |
1462 | 1475 | add_moddevtable(&buf, mod); |
1463 | 1476 | add_srcversion(&buf, mod); |
... | ... | @@ -1469,6 +1482,6 @@ |
1469 | 1482 | if (dump_write) |
1470 | 1483 | write_dump(dump_write); |
1471 | 1484 | |
1472 | - return 0; | |
1485 | + return err; | |
1473 | 1486 | } |