linux内核模块链接器警告:"***警告:<function> [<module>] undefined!" - 任何摆脱它们的方法?

Gar*_*ary 20 c++ linux compiler-errors kernel-module

在编译彼此依赖的Linux内核模块时,链接器会给出未定义的符号警告

 Building modules, stage 2.
 MODPOST
*** Warning: "function_name1" [module_name] undefined!
*** Warning: "function_name2" [module_name] undefined!
*** Warning: "function_name3" [module_name] undefined!
Run Code Online (Sandbox Code Playgroud)

一旦使用insmod或modprobe将模块插入内核,就会解析未解析的符号.有没有办法摆脱链接器警告?

我已经阅读了3个关于这个问题的Google SERP - 似乎没有人知道答案.在构建内核模块时,这些链接器警告应该是这样的吗?

小智 16

使用KBUILD_EXTRA_SYMBOLS如下:KBUILD_EXTRA_SYMBOLS ='您的模块路径'/ Module.symvers


Gar*_*ary 9

终于我明白了.感谢shodanex让我走上正轨.

更新:将此修复程序应用于旧版本内核的构建时要非常小心,因为旧版本的内核中的 Makefile.modpost文件中存在一个错误,当您指定 KBUILD_EXTMOD选项时,这会导致构建行为异常并构建错误的目标.

您必须在KBUILD_EXTMOD make参数中指定所依赖模块源的路径.

比如,你有一个模块foo,它取决于模块栏中的符号.

foo的源文件在foo/module /中,bar的源文件在bar/module /中

在make命令生成文件FOO可能看起来像

make ARCH=$$ARCH CROSS_COMPILE=$$CROSS_COMPILE -C $$LINUX_DIR \
    M=`pwd`/module \
    modules
Run Code Online (Sandbox Code Playgroud)

(确切的行可能在您的项目中有所不同).

将其更改为

make ARCH=$$ARCH CROSS_COMPILE=$$CROSS_COMPILE -C $$LINUX_DIR \
    M=`pwd`/module \
    KBUILD_EXTMOD=`pwd`/../bar/module \
    modules
Run Code Online (Sandbox Code Playgroud)

(我们添加了KBUILD_EXTMOD = pwd/../bar/module\line,其中pwd/../bar/module是我们依赖的内核模块源的路径.

可以预期KBUILD_EXTRA_SYMBOLS参数以这种方式工作,但它是KBUILD_EXTMOD.


sho*_*nex 3

不,他们不是。无论您在树内还是树外构建代码,都不应显示此消息。我认为您应该修复您的 Makefile。这是一个 makefile 示例。并不完美,但曾经可以工作(直到 2.6.26,此后就没有尝试过):

ifneq ($(KERNELRELEASE),)
# We were called by kbuild

obj-m += mymodule.o 
mymodule-objs := mymodule_usb.o a.o b.o c.o

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
Run Code Online (Sandbox Code Playgroud)

有关更多文档,您可以检查内核树,kbuild 过程已记录