【问题标题】:Linux device driver module compilation using gcc使用 gcc 编译 Linux 设备驱动模块
【发布时间】:2013-03-09 06:25:08
【问题描述】:

我有一个基本的 linux 设备驱动模块:

#include <linux/init.h>
#include <linux/module.h>   
#include <linux/kernel.h>

static int __init hello_init(void)
{
printk(KERN_ALERT "Hello, world \n");
return 0;
}

static void __exit hello_exit(void)
{
printk(KERN_ALERT "Goodbye, world \n");
}

module_init(hello_init);
module_exit(hello_exit);

我能够以传统方式编译这个模块,即使用一个使用 obj-m 的简单 Makefile,但我想使用命令行 gcc 编译它。这是因为我可以使用 gcc -save-temps 标志来查看中间生成的文件(这对理解 Linux 内核使用大量预处理器内容特别有帮助)。

那么有没有办法使用命令行 gcc 进行编译??

编辑附加我用过的Makefile

ifeq ($(KERNELRELEASE),)
    KERNELDIR ?= /lib/modules/$(shell uname -r)/build
    PWD := $(shell pwd)

EXTRA_CFLAGS+= -save-temps

modules:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules

modules_install:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install

clean:
    rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions

.PHONY: modules modules_install clean

else

    obj-m := hello.o
endif

【问题讨论】:

  • 从命令行成功使用gcc取决于正确设置shell环境。这(部分)是 makeMakefile 的用途。如果您真的坚持使用 shell,那么您应该将您的Makefile 附加到您的问题中以供审核。

标签: linux gcc linux-device-driver


【解决方案1】:

您可以尝试在模块的 Makefile 中添加“EXTRA_CFLAGS”吗? 比如EXTRA_CFLAGS += -save-temps

希望对你有帮助!

【讨论】:

  • 尝试了你的建议没有工作:(它在生成.o文件的意义上正确执行,但我看不到中间文件(.i等),我尝试了一些变体你告诉但没有运气的建议:(
  • @LeoMessi -- 你到底尝试了什么?使用诸如EXTRA_CFLAGS 或仅CFLAGS 之类的变量是在Makefile 中自定义编译规则的可靠方法。你是不是刚刚定义了变量,而忘记在编译规则中插入变量? (在这方面,答案是不完整。)
  • @sawdust :我已经编辑了帖子以附加我尝试过的 Makefile。希望这会有所帮助
【解决方案2】:

我不知道如何直接在 Makefile 中执行此操作,但您可以逐个文件生成 .i 文件。从Linux内核源码的根目录:

make drivers/media/pci/sta2x11/sta2x11_vip.i

这将生成 .i 文件。要生成模块源文件(位于内核树之外),只需使用它的绝对路径:

make /path/to/hello.i

它应该可以工作

【讨论】:

    猜你喜欢
    • 2015-05-28
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    • 2011-01-17
    相关资源
    最近更新 更多