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 に答える