Linux内核模块链接器警告:“***警告:<函数> undefined!” – 任何方式摆脱他们?

编译互相依赖的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一个内核模块时,这些链接器警告是否应该是这样的?

Solutions Collecting From Web of "Linux内核模块链接器警告:“***警告:<函数> undefined!” – 任何方式摆脱他们?"

使用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的技术相关,以及它在哪些内核版本下工作的问题:

  • andycjw表示在2.6.12中没有为他工作
  • 它在2.6.15中没有为我工作(打破了我的模块构建)
  • 通过内核提交,我看到了许多Makefile.modpost的变化,似乎在2.6.26和2.6.28相关,所以我期望其中之一是限制。

我需要适合你的树。 在我们的源代码中,我们创建了一个SYMBOLSDIR,它是所有模块的路径

SYMBOLSDIR ='某些路径'

make(与上例相同)$(KERNELDIR)MODVERDIR = $(SYMBOLSDIR)模块