编译互相依赖的Linux内核模块时,链接器会提供未定义的符号警告
Building modules, stage 2. MODPOST *** Warning: "function_name1" [module_name] undefined! *** Warning: "function_name2" [module_name] undefined! *** Warning: "function_name3" [module_name] undefined!
一旦将模块插入到使用insmod或modprobe的内核中,即可parsing未parsing的符号。 有什么办法摆脱链接器的警告,但?
在这个问题上,我已经阅读了3个Google SERP,似乎没有人知道答案。 当你构build一个内核模块时,这些链接器警告是否应该是这样的?
使用KBUILD_EXTRA_SYMBOLS如下:KBUILD_EXTRA_SYMBOLS ='你的模块路径'/ modulee.symvers
最后我得到了它。 感谢shodanex让我走上正轨。
更新:当应用此修补程序构建较旧版本的内核时要非常小心,因为在旧版本的内核中存在一个Makefile.modpost文件中的错误,当您指定KBUILD_EXTMOD选项时,会使您的构建行为异常并生成错误的目标。
您必须在KBUILD_EXTMOD make参数中指定您依赖的模块源的路径。
说,你有一个模块foo依赖于模块栏中的符号。
foo的源文件在foo / module /中 ,而bar的源文件在bar / module /
Makefile中的make命令可能看起来像
make ARCH=$$ARCH CROSS_COMPILE=$$CROSS_COMPILE -C $$LINUX_DIR \ M=`pwd`/module \ modules
(确切的线路可能在您的项目中有所不同)。
将其更改为
make ARCH=$$ARCH CROSS_COMPILE=$$CROSS_COMPILE -C $$LINUX_DIR \ M=`pwd`/module \ KBUILD_EXTMOD=`pwd`/../bar/module \ modules
(我们添加了KBUILD_EXTMOD = pwd
/../bar/module \行,其中pwd
/../bar/module是我们依赖的内核模块的源的路径。
人们会希望KBUILD_EXTRA_SYMBOLS参数以这种方式工作,但它是KBUILD_EXTMOD 。
不,他们不是。 你建立你的代码树内或树外,这个消息不应该显示。我认为你应该修复你的Makefile。 这是一个例子makefile。 不完美,但习惯于工作(直到2.6.26,从此没有尝试):
ifneq ($(KERNELRELEASE),) # We were called by kbuild obj-m += mymodule.o mymodule-objs := mymodule_usb.o ao bo co else # We were called from command line KDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: @echo ' Building FOO drivers for 2.6 kernel.' @echo ' PLEASE IGNORE THE "Overriding SUBDIRS" WARNING' $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules install: ./do_install.sh *.ko endif # End kbuild check clean: rm -f -r *.o *.ko .*cmd .tmp* core *.i
为了进一步的文档,你可以检查内核树,kbuild过程被记录
与上述使用KBUILD_EXTMOD的技术相关,以及它在哪些内核版本下工作的问题:
我需要适合你的树。 在我们的源代码中,我们创建了一个SYMBOLSDIR,它是所有模块的路径
SYMBOLSDIR ='某些路径'
make(与上例相同)$(KERNELDIR)MODVERDIR = $(SYMBOLSDIR)模块