我试图从多个源文件构建一个Linux内核模块。我使用以下Makefile:
obj-m := mymodule.o
mymodule-y := mymodule_a.o mymodule_b.o mymodule_c.o
all:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
$(MAKE) -C $(KERNELDIR) M=$(PWD) clean
然而,即使构建成功,modinfo的输出也不是预期的那样。具体来说,许可证、作者、参数等。都有一个前缀(在本例中为“mymodule.”):
mymodule.description: mymodule driver
mymodule.author: myname
mymodule.license: GPL
我期望的是:
description: mymodule driver
author: myname
license: GPL
我注意到,在使用内核版本5.19构建模块时,不会出现这种前缀问题。但是,当使用内核版本5.4进行构建时,该问题确实会出现。我尝试了几种方法(不生成中间.o文件,直接添加到obj-m等),但没有一种方法可以解决这个问题。
有谁知道为什么这个前缀被添加到特定的内核版本,以及如何防止这种情况?
1条答案
按热度按时间w8ntj3qf1#
已通过向编译器添加
-fno-pic
标志解决此问题。这是通过将EXTRA_CFLAGS+=-fno-pic
添加到Makefile来完成的。位置无关代码(PIC)通常不需要用于内核模块。禁用PIC解决了我面临的modinfo前缀问题。