Skip to content

Commit

Permalink
kbuild: generate Module.symvers only when vmlinux exists
Browse files Browse the repository at this point in the history
[ Upstream commit 69bc8d3 ]

The external module build shows the following warning if Module.symvers
is missing in the kernel tree.

  WARNING: Symbol version dump "Module.symvers" is missing.
           Modules may not have dependencies or modversions.

I think this is an important heads-up because the resulting modules may
not work as expected. This happens when you did not build the entire
kernel tree, for example, you might have prepared the minimal setups
for external modules by 'make defconfig && make modules_preapre'.

A problem is that 'make modules' creates Module.symvers even without
vmlinux. In this case, that warning is suppressed since Module.symvers
already exists in spite of its incomplete content.

The incomplete (i.e. invalid) Module.symvers should not be created.

This commit changes the second pass of modpost to dump symbols into
modules-only.symvers. The final Module.symvers is created by
concatenating vmlinux.symvers and modules-only.symvers if both exist.

Module.symvers is supposed to collect symbols from both vmlinux and
modules. It might be a bit confusing, and I am not quite sure if it
is an official interface, but presumably it is difficult to rename it
because some tools (e.g. kmod) parse it.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
masahir0y authored and gregkh committed May 19, 2021
1 parent 9401b7f commit d0736af
Show file tree
Hide file tree
Showing 5 changed files with 18 additions and 16 deletions.
1 change: 1 addition & 0 deletions .gitignore
Expand Up @@ -55,6 +55,7 @@ modules.order
/tags
/TAGS
/linux
/modules-only.symvers
/vmlinux
/vmlinux.32
/vmlinux.symvers
Expand Down
1 change: 1 addition & 0 deletions Documentation/dontdiff
Expand Up @@ -178,6 +178,7 @@ mktables
mktree
mkutf8data
modpost
modules-only.symvers
modules.builtin
modules.builtin.modinfo
modules.nsdeps
Expand Down
2 changes: 1 addition & 1 deletion Makefile
Expand Up @@ -1483,7 +1483,7 @@ endif # CONFIG_MODULES
# make distclean Remove editor backup files, patch leftover files and the like

# Directories & files removed with 'make clean'
CLEAN_FILES += include/ksym vmlinux.symvers \
CLEAN_FILES += include/ksym vmlinux.symvers modules-only.symvers \
modules.builtin modules.builtin.modinfo modules.nsdeps \
compile_commands.json

Expand Down
15 changes: 14 additions & 1 deletion scripts/Makefile.modpost
Expand Up @@ -65,7 +65,20 @@ else
ifeq ($(KBUILD_EXTMOD),)

input-symdump := vmlinux.symvers
output-symdump := Module.symvers
output-symdump := modules-only.symvers

quiet_cmd_cat = GEN $@
cmd_cat = cat $(real-prereqs) > $@

ifneq ($(wildcard vmlinux.symvers),)

__modpost: Module.symvers
Module.symvers: vmlinux.symvers modules-only.symvers FORCE
$(call if_changed,cat)

targets += Module.symvers

endif

else

Expand Down
15 changes: 1 addition & 14 deletions scripts/mod/modpost.c
Expand Up @@ -2481,19 +2481,6 @@ static void read_dump(const char *fname)
fatal("parse error in symbol dump file\n");
}

/* For normal builds always dump all symbols.
* For external modules only dump symbols
* that are not read from kernel Module.symvers.
**/
static int dump_sym(struct symbol *sym)
{
if (!external_module)
return 1;
if (sym->module->from_dump)
return 0;
return 1;
}

static void write_dump(const char *fname)
{
struct buffer buf = { };
Expand All @@ -2504,7 +2491,7 @@ static void write_dump(const char *fname)
for (n = 0; n < SYMBOL_HASH_SIZE ; n++) {
symbol = symbolhash[n];
while (symbol) {
if (dump_sym(symbol)) {
if (!symbol->module->from_dump) {
namespace = symbol->namespace;
buf_printf(&buf, "0x%08x\t%s\t%s\t%s\t%s\n",
symbol->crc, symbol->name,
Expand Down

0 comments on commit d0736af

Please sign in to comment.