在编译彼此依赖的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将模块插入内核,就会解析未解析的符号.有没有办法摆脱链接器警告?
我已经阅读了3个关于这个问题的Google SERP - 似乎没有人知道答案.在构建内核模块时,这些链接器警告应该是这样的吗?
使用KBUILD_EXTRA_SYMBOLS如下:KBUILD_EXTRA_SYMBOLS ='您的模块路径'/ Module.symvers
终于我明白了.感谢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
(确切的行可能在您的项目中有所不同).
将其更改为
make ARCH=$$ARCH CROSS_COMPILE=$$CROSS_COMPILE -C $$LINUX_DIR \ M=`pwd`/module \ KBUILD_EXTMOD=`pwd`/../bar/module \ modules
(我们添加了KBUILD_EXTMOD = pwd
/../bar/module\line,其中pwd
/../bar/module是我们依赖的内核模块源的路径.
可以预期KBUILD_EXTRA_SYMBOLS参数以这种方式工作,但它是KBUILD_EXTMOD.