簡體   English   中英

從幾個源文件構建一個 kernel 模塊,其中一個與模塊同名

[英]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 SoCpetalinux時偶然發現了這個問題,請注意 generated.bb (bitbake) 文件。 除了在 Makefile 中指定 object 文件:

modulename-objs+= src1.o src2.o

所有文件(包括文件頭)都必須列在 modulename.bb 文件的SRC_URI變量中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM