[英]Building a kernel module from several source files which one of them has the same name as the module
是否可以從多個源文件構建一個 kernel 模塊,其中一個與模塊同名?
例如:我想用以下源文件構建“mymodule.ko”:
我的模塊.c
mymodule_func.c
這個 makefile 不起作用:
#Makefile
obj-m += mymodule.o
mymodule-objs := mymodule.o mymodule_func.o
謝謝
我找到了一個解決方案,我將源文件放在一個子文件夾中:
生成文件
src/mymodule.c
src/mymodule_func.c
#Makefile
obj-m += mymodule.o
mymodule-objs := ./src/mymodule.o ./src/mymodule_func.o
all:
make -C $(KERNEL_PATH) M=$(PWD) modules
clean:
make -C $(KERNEL_PATH) M=$(PWD) clean
在內核生成文件中修復的正確方法是:
#
obj-m+= my_module.o
#append other source files except my_module.c which would be include by default
my_module-objs+= src1.o src2.o
根據我的理解,模塊名稱和源名稱不可能相同。 最好提供模塊名稱為module.o
並使用 Makefile 編譯可加載的內核模塊,如下所示,
生成文件
# If KERNELRELEASE is defined, we've been invoked from the
# kernel build system and can use its language.
ifneq ($(KERNELRELEASE),)
**obj-m := module.o
module-objs := mymodule.o mymodule_func.o**
# Otherwise we were called directly from the command
# line; invoke the kernel build system.
EXTRA_CFLAGS += -DDEBUG
else
KERNELDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif
clean:
$(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) clean
你可以使用TARGET
來命名你的 .ko 文件,就像我在這個例子中所做的那樣:
TARGET = can
KDIR = /lib/modules/3.1.10-1.16-desktop/build
PWD := $(shell pwd)
obj-m += $(TARGET).o
can-objs := can_core.o can_open.o can_select.o can_sysctl.o can_write.o \
can_close.o can_ioctl.o can_read.o can_util.o \
can_debug.o can_error.o \
can_async.o can_sim.o
default:
make -C $(KDIR) M=$(PWD) modules
所以在構建之后我以一堆目標文件和can.ko
另一種解決方案是創建文件的符號鏈接,例如:
mymodule.c: ln -sf mymodule.c _mymodule.c
現在,使用_mymodule.o
作為對象名稱:
mymodule-objs := _mymodule.o
如果有人在使用Xilinx SoC和petalinux時偶然發現了這個問題,請注意 generated.bb (bitbake) 文件。 除了在 Makefile 中指定 object 文件:
modulename-objs+= src1.o src2.o
所有文件(包括文件頭)都必須列在 modulename.bb 文件的SRC_URI
變量中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.