1
votes

I'm writing a custom kernel module (let's call it mod1) that I would like to export functions for use in other modules (let's call those mod2, etc...). When compiling the other modules, I get warning messages about undefined symbols (functions in mod1). Though everything should work fine after loading, I like to compile without warnings. I read that I should add the path to mod1's Module.symvers to KBUILD_EXTRA_SYMBOLS However, I noticed that my Module.symvers file is empty. What am I doing wrong?

Here's a MWE of a module:

#include <linux/module.h>

MODULE_INFO(version, "0.1");
MODULE_AUTHOR("Me");
MODULE_LICENSE("GPL");

int foo(int x) {
    return x;
}
EXPORT_SYMBOL_GPL(foo)

And a Makefile:

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

And me running make showing that Module.symvers is empty:

user@host:~/mwe$ make; [[ -s ./Module.symvers ]] || echo "File size is zero!"
make -C /lib/modules/3.13.0-30-generic/build M=/home/user/mwe modules
make[1]: Entering directory `/usr/src/linux-headers-3.13.0-30-generic'
  Building modules, stage 2.
  MODPOST 0 modules
make[1]: Leaving directory `/usr/src/linux-headers-3.13.0-30-generic'
File size is zero!

I'm not sure what I'm doing wrong and my search for answers has been fruitless thusfar.

1

1 Answers

2
votes

Looks like the Makefile is incorrect. Where is the name of the file you want to compile ? Change test.o to whatever your filename.

Makefile:

obj-m += test.o

all:
            make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
            make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean