0

我有一个基本的 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
4

2 回答 2

1

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

希望对你有帮助!

于 2013-03-09T10:02:28.417 回答
0

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

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

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

make /path/to/hello.i

它应该工作

于 2013-03-13T23:30:55.433 回答