On 9/17/25 7:03 PM, Josh Poimboeuf wrote:
In preparation for the objtool klp diff subcommand, remove the arbitrary
'kmod_' prefix from __KBUILD_MODNAME and instead add it explicitly in
the __initcall_id() macro.

This change supports the standardization of "unique" symbol naming by
ensuring the non-unique portion of the name comes before the unique
part.  That will enable objtool to properly correlate symbols across
builds.

Cc: Masahiro Yamada <[email protected]>
Signed-off-by: Josh Poimboeuf <[email protected]>
---
  include/linux/init.h | 3 ++-
  scripts/Makefile.lib | 2 +-
  2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/include/linux/init.h b/include/linux/init.h
index 17c1bc712e234..40331923b9f4a 100644
--- a/include/linux/init.h
+++ b/include/linux/init.h
@@ -200,12 +200,13 @@ extern struct module __this_module;
/* Format: <modname>__<counter>_<line>_<fn> */
  #define __initcall_id(fn)                                     \
+       __PASTE(kmod_,                                          \
        __PASTE(__KBUILD_MODNAME,                               \
        __PASTE(__,                                             \
        __PASTE(__COUNTER__,                                    \
        __PASTE(_,                                              \
        __PASTE(__LINE__,                                       \
-       __PASTE(_, fn))))))
+       __PASTE(_, fn)))))))
/* Format: __<prefix>__<iid><id> */
  #define __initcall_name(prefix, __iid, id)                    \
diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
index 1d581ba5df66f..b955602661240 100644
--- a/scripts/Makefile.lib
+++ b/scripts/Makefile.lib
@@ -20,7 +20,7 @@ name-fix-token = $(subst $(comma),_,$(subst -,_,$1))
  name-fix = $(call stringify,$(call name-fix-token,$1))
  basename_flags = -DKBUILD_BASENAME=$(call name-fix,$(basetarget))
  modname_flags  = -DKBUILD_MODNAME=$(call name-fix,$(modname)) \
-                -D__KBUILD_MODNAME=kmod_$(call name-fix-token,$(modname))
+                -D__KBUILD_MODNAME=$(call name-fix-token,$(modname))

As others have mentioned, this breaks modules.alias generation.

The following diff seems to fix it, although in introduces a slight
functional change if symbols do not actually follow the naming scheme.

diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c
index b3333560b95e..c3c06b944c69 100644
--- a/scripts/mod/file2alias.c
+++ b/scripts/mod/file2alias.c
@@ -1489,14 +1489,11 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,
        if (ELF_ST_TYPE(sym->st_info) != STT_OBJECT)
                return;

- /* All our symbols are of form __mod_device_table__kmod_<modname>__<type>__<name>. */ + /* All our symbols are of form __mod_device_table__<modname>__<type>__<name>. */
        if (!strstarts(symname, prefix))
                return;

-       modname = strstr(symname, "__kmod_");
-       if (!modname)
-               return;
-       modname += strlen("__kmod_");
+       modname = symname + strlen(prefix);

        type = strstr(modname, "__");
        if (!type)

It would seem like rust generated symbols don't follow it exactly?

See module_device_table macro in rust/kernel/device_id.rs.

  modfile_flags  = -DKBUILD_MODFILE=$(call stringify,$(modfile))
_c_flags = $(filter-out $(CFLAGS_REMOVE_$(target-stem).o), \


Reply via email to