insmod fails with “Unknown symbol in module” for a symbol defined in another module

后端 未结 2 1147
温柔的废话
温柔的废话 2021-02-04 04:49

I am working in Ubuntu. I am trying to make two kernel modules which uses each other functions. My problem is that I got modules properly compiled, but the symbol is not resolve

2条回答
  •  时光说笑
    2021-02-04 05:29

    When you build m2, it creates a Module.symvers file.

    Copy this file to where you are building m1. Then make m1, and insmod it.

    You probably had a warning when you were building m1 before, something like:

    WARNING: "func_m2" [/tmp/m1/m1.ko] undefined!

    This should disappear once you use the Module.symvers from the m2 module.

    From http://www.kernel.org/doc/Documentation/kbuild/modules.txt:

    --- 6.2 Symbols and External Modules

    When building an external module, the build system needs access to the symbols from the kernel to check if all external symbols are defined. This is done in the MODPOST step. modpost obtains the symbols by reading Module.symvers from the kernel source tree. If a Module.symvers file is present in the directory where the external module is being built, this file will be read too. During the MODPOST step, a new Module.symvers file will be written containing all exported symbols that were not defined in the kernel.

    And this is also worth reading, from the same file:

    --- 6.3 Symbols From Another External Module

    Sometimes, an external module uses exported symbols from another external module. kbuild needs to have full knowledge of all symbols to avoid spitting out warnings about undefined symbols. Three solutions exist for this situation.

    NOTE: The method with a top-level kbuild file is recommended but may be impractical in certain situations.

    Use a top-level kbuild file If you have two modules, foo.ko and bar.ko, where foo.ko needs symbols from bar.ko, you can use a common top-level kbuild file so both modules are compiled in the same build. Consider the following directory layout:

    ./foo/ <= contains foo.ko ./bar/ <= contains bar.ko

    The top-level kbuild file would then look like:

    $ ./Kbuild (or ./Makefile): obj-y := foo/ bar/

    And executing

    $ make -C $KDIR M=$PWD

    will then do the expected and compile both modules with full knowledge of symbols from either module.

    Use an extra Module.symvers file When an external module is built, a Module.symvers file is generated containing all exported symbols which are not defined in the kernel. To get access to symbols from bar.ko, copy the Module.symvers file from the compilation of bar.ko to the directory where foo.ko is built. During the module build, kbuild will read the Module.symvers file in the directory of the external module, and when the build is finished, a new Module.symvers file is created containing the sum of all symbols defined and not part of the kernel.

    Use "make" variable KBUILD_EXTRA_SYMBOLS If it is impractical to copy Module.symvers from another module, you can assign a space separated list of files to KBUILD_EXTRA_SYMBOLS in your build file. These files will be loaded by modpost during the initialization of its symbol tables.

提交回复
热议问题