编译互相依赖的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一个内核模块时,这些链接器警告是否应该是这样的?
如何重命名内核模块名称,而不重命名传递给insmod的.ko。
使用模块读取内核内存
没有设备的设备驱动程序?
Linux的request_threaded_irq irq号码
获取Linux内核中的networking设备列表
使用proc文件打印mem_map的虚拟地址
如何从熵池中阻止/ dev / random population。 我可以卸载一个模块来做到这一点?
如何用QEMUdebuggingLinux内核模块?
使用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)模块
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。