23

在编译相互依赖的 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 - 似乎没有人知道答案。当您构建内核模块时,这些链接器警告是否应该是这种方式?

4

5 回答 5

16

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

于 2010-02-26T14:42:50.523 回答
9

最后我得到了它。感谢 shodanex 让我走上正轨。

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

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

比如说,你有一个模块foo依赖于模块bar中的符号。

foo的源文件在foo/module/和 bar 的源文件在bar/module/

Makefile for foo中的 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

于 2009-03-09T18:06:31.177 回答
3

不,他们不是。无论您在树内还是在树外构建代码,都不应显示此消息。我认为您应该修复您的 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

如需进一步的文档,您可以查看内核树,记录了 kbuild 过程

于 2009-03-09T10:53:22.153 回答
1

与上述使用 KBUILD_EXTMOD 的技术相关,以及它在哪些内核版本下工作的问题:

  • andycjw 表示它在 2.6.12 中对他不起作用
  • 它在 2.6.15 中对我不起作用(破坏了我的模块构建)
  • 查看内核提交,我看到 Makefile.modpost 的许多更改似乎与 2.6.26 和 2.6.28 相关,所以我希望其中之一是限制。
于 2010-08-31T19:18:54.663 回答
0

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

SYMBOLSDIR = '一些路径'

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

于 2009-06-04T21:39:46.277 回答