13

I am trying to compile a driver that we have from source and I am working through the issues with a new target environment. One of the slightly disturbing things I see is the following warning:

  WARNING: Symbol version dump /usr/src/linux-2.6.38/Module.symvers
           is missing; modules will have no dependencies and modversions.

I spent a fair amount of time looking on the web and this is shown in output frequently when other questions are asked, but I didn't see any commentary about whether or not this is an issue.

In any case, how would I tell linux/ubuntu to generate Module.symvers?

2 Answers 2

10

Module.symvers is generated when the kernel itself is compiled and ought to be provided to the user as part of the kernel build environment package, however that may look on Ubuntu (possibly broken there?) Fedora and openSUSE for example ship one or more “kernel-devel” (and/or similarly-named) packages that ship this build environment and make the file reachable through /lib/modules/<version>/build/Module.symvers. When using a self-compiled kernel, substitue /lib/modules/version/build for the appropriate path to the build directory (where all the .o files are).

5
  • Does this mean that the warning will go away when I have gotten the source to compile completely?
    – sage
    Commented Feb 24, 2012 at 5:04
  • The warning will go away once you have Module.symvers (each symvers file is specific to a kernel and the chosen config). You can either get this file by compiling the kernel yourself (for most that's just overkill and maintenance overhead) or, if you use a distro kernel, installing the right package containing Module.symvers.
    – jørgensen
    Commented Feb 26, 2012 at 5:32
  • 2
    You don't have to rebuild the kernel. Just have to give the right path to the build directory when compiling the module: make -C /lib/modules/$VERSION/build M=$(PWD) modules
    – Chandan
    Commented Jun 19, 2012 at 0:17
  • In Ubuntu the missing Module.symvers (symbol version dump) file is in the package named linux-headers-x.y.z; for example linux-headers-3.13.0-24-generic as can be found on packages.ubuntu.com
    – Pro Backup
    Commented Aug 23, 2014 at 20:16
  • Curious why current kernel-devel doesn't include symvers on openSUSE Tumbleweed. Commented Aug 20, 2018 at 13:10
0

replace this file [/linux-foo/scripts/Makefile.modpost]: with this one

    # SPDX-License-Identifier: GPL-2.0
# ===========================================================================
# Module versions
# ===========================================================================
#
# Stage one of module building created the following:
# a) The individual .o files used for the module
# b) A <module>.o file which is the .o files above linked together
# c) A <module>.mod file, listing the name of the preliminary <module>.o file,
#    plus all .o files
# d) modules.order, which lists all the modules

# Stage 2 is handled by this file and does the following
# 1) Find all modules listed in modules.order
# 2) modpost is then used to
# 3)  create one <module>.mod.c file per module
# 4)  create one Module.symvers file with CRC for all exported symbols

# Step 3 is used to place certain information in the module's ELF
# section, including information such as:
#   Version magic (see include/linux/vermagic.h for full details)
#     - Kernel release
#     - SMP is CONFIG_SMP
#     - PREEMPT is CONFIG_PREEMPT[_RT]
#     - GCC Version
#   Module info
#     - Module version (MODULE_VERSION)
#     - Module alias'es (MODULE_ALIAS)
#     - Module license (MODULE_LICENSE)
#     - See include/linux/module.h for more details

# Step 4 is solely used to allow module versioning in external modules,
# where the CRC of each module is retrieved from the Module.symvers file.

PHONY := __modpost
__modpost:

include include/config/auto.conf
include $(srctree)/scripts/Kbuild.include

MODPOST = scripts/mod/modpost

modpost-args =                                      \
    $(if $(CONFIG_MODULES),-M)                          \
    $(if $(CONFIG_MODVERSIONS),-m)                          \
    $(if $(CONFIG_MODULE_SRCVERSION_ALL),-a)                    \
    $(if $(CONFIG_SECTION_MISMATCH_WARN_ONLY),,-E)                  \
    $(if $(KBUILD_MODPOST_WARN),-w)                         \
    $(if $(KBUILD_NSDEPS),-d $(MODULES_NSDEPS))                 \
    $(if $(CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS)$(KBUILD_NSDEPS),-N)   \
    $(if $(findstring 1, $(KBUILD_EXTRA_WARN)),-W)                  \
    -o $@

modpost-deps := $(MODPOST)

# 'make -i -k' ignores compile errors, and builds as many modules as possible.
ifneq ($(findstring i,$(filter-out --%,$(MAKEFLAGS))),)
modpost-args += -n
endif

# Read out modules.order to pass in modpost.
# Otherwise, allmodconfig would fail with "Argument list too long".
ifdef KBUILD_MODULES
modpost-args += -T $(MODORDER)
modpost-deps += $(MODORDER)
endif

ifeq ($(KBUILD_EXTMOD),)

# Generate the list of in-tree objects in vmlinux
# ---------------------------------------------------------------------------

# This is used to retrieve symbol versions generated by genksyms.
ifdef CONFIG_MODVERSIONS
vmlinux.symvers Module.symvers: .vmlinux.objs
endif

# Ignore libgcc.a
# Some architectures do '$(CC) --print-libgcc-file-name' to borrow libgcc.a
# from the toolchain, but there is no EXPORT_SYMBOL in it.

quiet_cmd_vmlinux_objs = GEN     $@
      cmd_vmlinux_objs =        \
    for f in $(real-prereqs); do    \
        case $${f} in       \
        *libgcc.a) ;;       \
        *) $(AR) t $${f} ;; \
        esac            \
    done > $@

targets += .vmlinux.objs
.vmlinux.objs: vmlinux.a $(KBUILD_VMLINUX_LIBS) FORCE
    $(call if_changed,vmlinux_objs)

ifdef CONFIG_TRIM_UNUSED_KSYMS
ksym-wl := $(CONFIG_UNUSED_KSYMS_WHITELIST)
ksym-wl := $(if $(filter-out /%, $(ksym-wl)),$(srctree)/)$(ksym-wl)
modpost-args += -t $(addprefix -u , $(ksym-wl))
modpost-deps += $(ksym-wl)
endif

ifeq ($(wildcard vmlinux.o),)
missing-input := vmlinux.o
output-symdump := modules-only.symvers
else
modpost-args += vmlinux.o
modpost-deps += vmlinux.o
output-symdump := $(if $(KBUILD_MODULES), Module.symvers, vmlinux.symvers)
endif

else

# set src + obj - they may be used in the modules's Makefile
obj := $(KBUILD_EXTMOD)
src := $(obj)

# Include the module's Makefile to find KBUILD_EXTRA_SYMBOLS
include $(kbuild-file)

output-symdump := $(KBUILD_EXTMOD)/Module.symvers

ifeq ($(wildcard Module.symvers),)
missing-input := Module.symvers
else
modpost-args += -i Module.symvers
modpost-deps += Module.symvers
endif

modpost-args += -e $(addprefix -i , $(KBUILD_EXTRA_SYMBOLS))

endif # ($(KBUILD_EXTMOD),)

quiet_cmd_modpost = MODPOST $@
      cmd_modpost = \
    $(if $(missing-input), \
        echo >&2 "WARNING: $(missing-input) is missing."; \
        echo >&2 "         Modules may not have dependencies or modversions."; \
        echo >&2 "         You may get many unresolved symbol errors."; \
        echo >&2 "         You can set KBUILD_MODPOST_WARN=1 to turn errors into warning"; \
        echo >&2 "         if you want to proceed at your own risk.";) \
    $(MODPOST) $(modpost-args)

targets += $(output-symdump)
$(output-symdump): $(modpost-deps) FORCE
    $(call if_changed,modpost)

__modpost: $(output-symdump)
PHONY += FORCE
FORCE:

existing-targets := $(wildcard $(sort $(targets)))

-include $(foreach f,$(existing-targets),$(dir $(f)).$(notdir $(f)).cmd)

.PHONY: $(PHONY)</pre>````

and rerun make command this will work.
2
  • 1
    don't use links, they may change or get unavailable. Copy the code from the link into your comment.
    – deelde
    Commented Nov 18, 2023 at 17:08
  • This does not work. Just tested and I get: scripts/Makefile.modpost:145: FORCE prerequisite is missing scripts/Makefile.modpost:145: *** missing separator. Stop. make[1]: *** [/root/linux/Makefile:1873: modpost] Error 2 make: *** [Makefile:240: __sub-make] Error 2 Commented Feb 1 at 15:55

Not the answer you're looking for? Browse other questions tagged or ask your own question.