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 - 似乎没有人知道答案.在构建内核模块时,这些链接器警告应该是这样的吗?
终于我明白了.感谢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.
不,他们不是。无论您在树内还是树外构建代码,都不应显示此消息。我认为您应该修复您的 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 过程已记录