modpost: Allow extended modversions without basic MODVERSIONS
authorMatthew Maurer <mmaurer@google.com>
Fri, 3 Jan 2025 17:37:03 +0000 (17:37 +0000)
committerMasahiro Yamada <masahiroy@kernel.org>
Fri, 10 Jan 2025 17:36:32 +0000 (02:36 +0900)
If you know that your kernel modules will only ever be loaded by a newer
kernel, you can disable BASIC_MODVERSIONS to save space. This also
allows easy creation of test modules to see how tooling will respond to
modules that only have the new format.

Signed-off-by: Matthew Maurer <mmaurer@google.com>
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
kernel/module/Kconfig
scripts/Makefile.modpost
scripts/mod/modpost.c

index 9568b629a03ce8289d3f3597eefc66fc96445720..4538f3af63e1ca531d0f74ef45a6f5268e505aec 100644 (file)
@@ -217,6 +217,21 @@ config EXTENDED_MODVERSIONS
          The most likely reason you would enable this is to enable Rust
          support. If unsure, say N.
 
+config BASIC_MODVERSIONS
+       bool "Basic Module Versioning Support"
+       depends on MODVERSIONS
+       default y
+       help
+         This enables basic MODVERSIONS support, allowing older tools or
+         kernels to potentially load modules.
+
+         Disabling this may cause older `modprobe` or `kmod` to be unable
+         to read MODVERSIONS information from built modules. With this
+         disabled, older kernels may treat this module as unversioned.
+
+         This is enabled by default when MODVERSIONS are enabled.
+         If unsure, say Y.
+
 config MODULE_SRCVERSION_ALL
        bool "Source checksum for all modules"
        help
index 40426fc6350985780c0092beb49c6cc29b9eff62..d7d45067d08b94a82451d66a64eae29b6826e139 100644 (file)
@@ -43,6 +43,7 @@ MODPOST = $(objtree)/scripts/mod/modpost
 modpost-args =                                                                         \
        $(if $(CONFIG_MODULES),-M)                                                      \
        $(if $(CONFIG_MODVERSIONS),-m)                                                  \
+       $(if $(CONFIG_BASIC_MODVERSIONS),-b)                                            \
        $(if $(CONFIG_EXTENDED_MODVERSIONS),-x)                                         \
        $(if $(CONFIG_MODULE_SRCVERSION_ALL),-a)                                        \
        $(if $(CONFIG_SECTION_MISMATCH_WARN_ONLY),,-E)                                  \
index 38ff3dd4a9a16e0b87f7ef4fed42f8071e1f8356..e18ae7dc8140a6d3d3bd26dd67cb1db5546b003d 100644 (file)
@@ -33,6 +33,8 @@ static bool module_enabled;
 static bool modversions;
 /* Is CONFIG_MODULE_SRCVERSION_ALL set? */
 static bool all_versions;
+/* Is CONFIG_BASIC_MODVERSIONS set? */
+static bool basic_modversions;
 /* Is CONFIG_EXTENDED_MODVERSIONS set? */
 static bool extended_modversions;
 /* If we are modposting external module set to 1 */
@@ -1857,7 +1859,7 @@ static void add_versions(struct buffer *b, struct module *mod)
 {
        struct symbol *s;
 
-       if (!modversions)
+       if (!basic_modversions)
                return;
 
        buf_printf(b, "\n");
@@ -2177,7 +2179,7 @@ int main(int argc, char **argv)
        LIST_HEAD(dump_lists);
        struct dump_list *dl, *dl2;
 
-       while ((opt = getopt(argc, argv, "ei:MmnT:to:au:WwENd:x")) != -1) {
+       while ((opt = getopt(argc, argv, "ei:MmnT:to:au:WwENd:xb")) != -1) {
                switch (opt) {
                case 'e':
                        external_module = true;
@@ -2226,6 +2228,9 @@ int main(int argc, char **argv)
                case 'd':
                        missing_namespace_deps = optarg;
                        break;
+               case 'b':
+                       basic_modversions = true;
+                       break;
                case 'x':
                        extended_modversions = true;
                        break;