linux kernel module linker warnings: "*** Warning: <function> [<module>] undefined!" - any way to get rid of them? linux kernel module linker warnings: "*** Warning: <function> [<module>] undefined!" - any way to get rid of them? linux linux

linux kernel module linker warnings: "*** Warning: <function> [<module>] undefined!" - any way to get rid of them?


Use KBUILD_EXTRA_SYMBOLS as below:KBUILD_EXTRA_SYMBOLS='your module path'/Module.symvers


Finally, I got it. Thanks to shodanex for putting me on the right track.

Update: Be very careful when applying this fix to builds for older versions of kernel, as there is a bug in Makefile.modpost file in older versions of the kernel which makes your build misbehave and build wrong targets when you specify KBUILD_EXTMOD option.

You have to specify the paths to the source of the modules you depend on in KBUILD_EXTMOD make parameter.

Say, you have a module foo that depends on symbols from module bar.

Source files for foo are in foo/module/ and source files for bar are in bar/module/

The make command in Makefile for foo probably looks like

make ARCH=$$ARCH CROSS_COMPILE=$$CROSS_COMPILE -C $$LINUX_DIR \    M=`pwd`/module \    modules

(the exact line may differ in your project).

Change it to

make ARCH=$$ARCH CROSS_COMPILE=$$CROSS_COMPILE -C $$LINUX_DIR \    M=`pwd`/module \    KBUILD_EXTMOD=`pwd`/../bar/module \    modules

(we added the KBUILD_EXTMOD=pwd/../bar/module \ line, where pwd/../bar/module is a path to sources of kernel module we depend on.

One would expect KBUILD_EXTRA_SYMBOLS parameter to work this way, however it's KBUILD_EXTMOD.


No they are not. Wheter you build your code in-tree or out of tree, this message should not be displayed.I think you should fix your Makefile. Here is an example makefile. Not perfect, but used to work (until 2.6.26, did not try it since) :

ifneq ($(KERNELRELEASE),)# We were called by kbuildobj-m += mymodule.o mymodule-objs := mymodule_usb.o a.o b.o c.oelse  # We were called from command lineKDIR := /lib/modules/$(shell uname -r)/buildPWD  := $(shell pwd)default:    @echo '    Building FOO drivers for 2.6 kernel.'    @echo '    PLEASE IGNORE THE "Overriding SUBDIRS" WARNING'    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modulesinstall:    ./do_install.sh *.koendif  # End kbuild checkclean:    rm -f -r *.o *.ko .*cmd .tmp* core *.i

For further documentation, you can check the kernel tree, the kbuild process is documented