2013-03-09 32 views
0

我有一個基本的Linux設備驅動程序模塊:Linux設備驅動模塊編譯使用gcc

#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); 

我能夠編譯它是通過一個簡單的Makefile文件,它使用OBJ-M傳統方式這個模塊,但我想用命令行gcc編譯這個。這是因爲我可以使用gcc -save-temps標誌來查看中間生成的文件(當Linux內核使用大量預處理器時,這可能特別有用)。

那麼有沒有辦法使用命令行gcc編譯?

編輯附加我用

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 
+0

在命令行中使用'gcc'成功取決於建立外殼環境適當。這是(部分)make和makefile的作用。如果你真的堅持使用shell,那麼你應該把你的'Makefile'附加到你的問題上以供審查。 – sawdust 2013-03-09 21:28:49

回答

1

你可以嘗試在你的模塊的Makefile加上 「EXTRA_CFLAGS」 Makefile文件? 如EXTRA_CFLAGS + = - 保存臨時工

希望它能幫助你!

+0

嘗試了你的建議沒有工作:(它在正確執行.o文件生成,但我無法看到中間文件(.i等),我嘗試了一些變化的建議,你告訴,但沒有運氣:( – 2013-03-09 10:51:36

+1

@LeoMessi - 你究竟做了什麼?使用諸如'EXTRA_CFLAGS'或者'CFLAGS'這樣的變量是在Makefiles中定製編譯規則的可靠和真實的方法。你剛剛定義了變量,並且忘記了在編譯規則中插入變量?(在這方面的答案是**不完整**)。 – sawdust 2013-03-09 21:21:46

+0

@sawdust:我編輯了附加Makefile的帖子,我試過了。希望這有助於 – 2013-03-10 05:46:00

0

我不知道如何直接在Makefile中,但是可以通過文件生成你的.i文件。從Linux內核源代碼的根目錄:

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

這將產生。我文件。要生成模塊的源文件(它是內核樹之外)只使用絕對路徑設置爲:

make /path/to/hello.i 

它應該工作