On 4/26/25 18:16, Alexey Gladkov wrote: > For some modules, modalias is generated using the modpost utility and > the section is added to the module file. > > When a module is added inside vmlinux, modpost does not generate > modalias for such modules and the information is lost. > > As a result kmod (which uses modules.builtin.modinfo in userspace) > cannot determine that modalias is handled by a builtin kernel module. > > $ cat /sys/devices/pci0000:00/0000:00:14.0/modalias > pci:v00008086d0000A36Dsv00001043sd00008694bc0Csc03i30 > > $ modinfo xhci_pci > name: xhci_pci > filename: (builtin) > license: GPL > file: drivers/usb/host/xhci-pci > description: xHCI PCI Host Controller Driver > > Missing modalias "pci:v*d*sv*sd*bc0Csc03i30*" which will be generated by > modpost if the module is built separately. > > To fix this it is necessary to generate the same modalias for vmlinux as > for the individual modules. Fortunately '.vmlinux.export.o' is already > generated from which '.modinfo' can be extracted in the same way as for > vmlinux.o. > > Signed-off-by: Alexey Gladkov <leg...@kernel.org> > --- > include/linux/module.h | 4 ---- > scripts/mod/file2alias.c | 13 ++++++++++++- > scripts/mod/modpost.c | 21 ++++++++++++++++++--- > scripts/mod/modpost.h | 7 ++++++- > 4 files changed, 36 insertions(+), 9 deletions(-) > > diff --git a/include/linux/module.h b/include/linux/module.h > index 7250b4a527ec..6225793ddcd4 100644 > --- a/include/linux/module.h > +++ b/include/linux/module.h > @@ -257,14 +257,10 @@ extern void cleanup_module(void); > __PASTE(type, \ > __PASTE(__, name))))))) > > -#ifdef MODULE > /* Creates an alias so file2alias.c can find device table. */ > #define MODULE_DEVICE_TABLE(type, name) \ > extern typeof(name) __mod_device_table(type, name) \ > __attribute__ ((unused, alias(__stringify(name)))) > -#else /* !MODULE */ > -#define MODULE_DEVICE_TABLE(type, name) > -#endif > > /* Version of form [<epoch>:]<version>[-<extra-version>]. > * Or for CVS/RCS ID version, everything but the number is stripped. > diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c > index dff1799a4c79..0fa3f031b904 100644 > --- a/scripts/mod/file2alias.c > +++ b/scripts/mod/file2alias.c > @@ -1471,7 +1471,8 @@ static const struct devtable devtable[] = { > /* Create MODULE_ALIAS() statements. > * At this time, we cannot write the actual output C source yet, > * so we write into the mod->dev_table_buf buffer. */ > -void handle_moddevtable(struct module *mod, struct elf_info *info, > +void handle_moddevtable(struct list_head *modules, > + struct module *mod, struct elf_info *info, > Elf_Sym *sym, const char *symname) > { > void *symval;
The new modules parameter is unused. > @@ -1509,6 +1510,16 @@ void handle_moddevtable(struct module *mod, struct > elf_info *info, > typelen = name - type; > name += strlen("__"); > > + if (mod->is_vmlinux) { > + struct module *builtin_mod; > + > + builtin_mod = new_module(modname, modnamelen); > + builtin_mod->is_vmlinux = mod->is_vmlinux; > + builtin_mod->dump_file = MODULE_BUILTIN_FNAME; The module.dump_file member is described in scripts/mod/modpost.h as "path to the .symvers file if loaded from a file". However, that is not the case here. Similarly, the module struct in scripts/mod/modpost.h is commented as "represent a module (vmlinux or *.ko)", but this patch expands its scope to also include builtin modules. I'm not sure it's best to overload this data in this way. I think mixing actual files and "logical" modules in the modules list is somewhat confusing. An alternative would be to keep a single module struct for vmlinux and record the discovered aliases under it? -- Thanks, Petr