【问题标题】:Building a kernel module from several source files which one of them has the same name as the module从多个源文件构建内核模块,其中一个与模块同名
【发布时间】:2012-11-16 08:43:10
【问题描述】:

是否可以从多个源文件构建一个内核模块,其中一个与模块同名?

例如: 我想用以下源文件构建“mymodule.ko”:
我的模块.c
mymodule_func.c

这个 makefile 不起作用:

#Makefile
obj-m += mymodule.o
mymodule-objs := mymodule.o mymodule_func.o

谢谢

【问题讨论】:

    标签: c linux makefile linux-kernel


    【解决方案1】:

    我找到了解决方案,我将源文件放在了一个子文件夹中:

    生成文件
    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
    

    【讨论】:

    • 确保您的跨文件函数未标记为静态。
    • 将 mymodule.{c,o} 重命名为 mymodule_main.{c,o} 并且不用担心额外的子目录不是更容易吗?
    【解决方案2】:

    在内核 make 文件中修复的正确方法如下:

    # 
    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
    

    【讨论】:

    • 感谢您的回答。我发现它是这里最有帮助的一个。
    • 这种方法对我不起作用,可能取决于内核/kbuild 版本。我没有进一步调查...
    【解决方案3】:

    据我了解,模块名称和源名称不可能相同。最好提供模块名称为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
    

    【讨论】:

    • 定义KERNELDIR 的一种有用方法是使用?= 而不是:=,以便它默认为当前运行的内核构建,但可以在make 命令行上覆盖。跨度>
    【解决方案4】:

    您可以使用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结束了

    【讨论】:

    • 如果我在 can-objs 中添加一个 can.o 对象,我会得到 make[2]: Circular can.o
    【解决方案5】:

    另一种解决方案是创建文件的符号链接,例如:

    mymodule.c: ln -sf mymodule.c _mymodule.c
    

    现在,使用_mymodule.o 作为对象名称:

    mymodule-objs := _mymodule.o 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-07
      • 2020-01-26
      • 2011-03-06
      • 1970-01-01
      • 2010-12-09
      • 2014-03-03
      • 1970-01-01
      相关资源
      最近更新 更多