OSDN Git Service

modpost: return error if module is missing ns imports and MODULE_ALLOW_MISSING_NAMESP...
authorJessica Yu <jeyu@kernel.org>
Fri, 6 Mar 2020 16:02:06 +0000 (17:02 +0100)
committerMasahiro Yamada <masahiroy@kernel.org>
Fri, 13 Mar 2020 01:04:36 +0000 (10:04 +0900)
Currently when CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS=n, modpost
only warns when a module is missing namespace imports. Under this
configuration, such a module cannot be loaded into the kernel anyway, as
the module loader would reject it. We might as well return a build
error when a module is missing namespace imports under
CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS=n, so that the build
warning does not go ignored/unnoticed.

Signed-off-by: Jessica Yu <jeyu@kernel.org>
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
scripts/Makefile.modpost
scripts/mod/modpost.c

index b4d3f2d..957eed6 100644 (file)
@@ -46,13 +46,14 @@ include scripts/Kbuild.include
 kernelsymfile := $(objtree)/Module.symvers
 modulesymfile := $(firstword $(KBUILD_EXTMOD))/Module.symvers
 
-MODPOST = scripts/mod/modpost                                          \
-       $(if $(CONFIG_MODVERSIONS),-m)                                  \
-       $(if $(CONFIG_MODULE_SRCVERSION_ALL),-a)                        \
-       $(if $(KBUILD_EXTMOD),-i,-o) $(kernelsymfile)                   \
-       $(if $(KBUILD_EXTMOD),$(addprefix -e ,$(KBUILD_EXTRA_SYMBOLS))) \
-       $(if $(KBUILD_EXTMOD),-o $(modulesymfile))                      \
-       $(if $(CONFIG_SECTION_MISMATCH_WARN_ONLY),,-E)                  \
+MODPOST = scripts/mod/modpost                                                          \
+       $(if $(CONFIG_MODVERSIONS),-m)                                                  \
+       $(if $(CONFIG_MODULE_SRCVERSION_ALL),-a)                                        \
+       $(if $(KBUILD_EXTMOD),-i,-o) $(kernelsymfile)                                   \
+       $(if $(KBUILD_EXTMOD),$(addprefix -e ,$(KBUILD_EXTRA_SYMBOLS)))                 \
+       $(if $(KBUILD_EXTMOD),-o $(modulesymfile))                                      \
+       $(if $(CONFIG_SECTION_MISMATCH_WARN_ONLY),,-E)                                  \
+       $(if $(CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS)$(KBUILD_NSDEPS),-N)       \
        $(if $(KBUILD_MODPOST_WARN),-w)
 
 ifdef MODPOST_VMLINUX
index a6f7b30..a3d8370 100644 (file)
@@ -39,6 +39,8 @@ static int sec_mismatch_count = 0;
 static int sec_mismatch_fatal = 0;
 /* ignore missing files */
 static int ignore_missing_files;
+/* If set to 1, only warn (instead of error) about missing ns imports */
+static int allow_missing_ns_imports;
 
 enum export {
        export_plain,      export_unused,     export_gpl,
@@ -2205,8 +2207,11 @@ static int check_exports(struct module *mod)
 
                if (exp->namespace &&
                    !module_imports_namespace(mod, exp->namespace)) {
-                       warn("module %s uses symbol %s from namespace %s, but does not import it.\n",
-                            basename, exp->name, exp->namespace);
+                       modpost_log(allow_missing_ns_imports ? LOG_WARN : LOG_ERROR,
+                                   "module %s uses symbol %s from namespace %s, but does not import it.\n",
+                                   basename, exp->name, exp->namespace);
+                       if (!allow_missing_ns_imports)
+                               err = 1;
                        add_namespace(&mod->missing_namespaces, exp->namespace);
                }
 
@@ -2549,7 +2554,7 @@ int main(int argc, char **argv)
        struct ext_sym_list *extsym_iter;
        struct ext_sym_list *extsym_start = NULL;
 
-       while ((opt = getopt(argc, argv, "i:e:mnsT:o:awEd:")) != -1) {
+       while ((opt = getopt(argc, argv, "i:e:mnsT:o:awENd:")) != -1) {
                switch (opt) {
                case 'i':
                        kernel_read = optarg;
@@ -2587,6 +2592,9 @@ int main(int argc, char **argv)
                case 'E':
                        sec_mismatch_fatal = 1;
                        break;
+               case 'N':
+                       allow_missing_ns_imports = 1;
+                       break;
                case 'd':
                        missing_namespace_deps = optarg;
                        break;