2012-02-29 53 views
10

我想編譯一個「hello world」內核模塊的例子, 在ubuntu 11.04,kernel 3.2.6,gcc 4.5.2和fedora 16上發現的問題,kernel 3.2.7,gcc 4.6.7。模塊編譯:asm/linkage.h文件沒有找到

代碼:

#include <linux/module.h> 
#include <linux/init.h> 
MODULE_LICENSE("GPL"); 

static int __init hello_init (void) 
{ 
printk("Hello module init\n"); 
return 0; 
} 
static void __exit hello_exit (void) 
{ 
printk("Hello module exit\n"); 
} 
module_init(hello_init); 
module_exit(hello_exit); 

編譯:

gcc -D__KERNEL__ -I /usr/src/linux/include/ -DMODULE -Wall -O2 -c hello.c -o hello.o 

錯誤:

In file included from /usr/src/linux/include/linux/kernel.h:13:0, from /usr/src/linux/include/linux/cache.h:4, from /usr/src/linux/include/linux/time.h:7, from /usr/src/linux/include/linux/stat.h:60, from /usr/src/linux/include/linux/module.h:10, from hello.c:1: /usr/src/linux/include/linux/linkage.h:5:25: fatal error: asm/linkage.h: file not found

後來我發現在/ usr/src/linux中/包括/沒有文件夾命名'asm',但'asm​​-generic'; 所以我做了一個軟鏈接「ASM」到「ASM-通用的」,並編譯agail:

這一次的錯誤是:

In file included from /usr/src/linux/include/linux/preempt.h:9:0, from /usr/src/linux/include/linux/spinlock.h:50, from /usr/src/linux/include/linux/seqlock.h:29, from /usr/src/linux/include/linux/time.h:8, from /usr/src/linux/include/linux/stat.h:60, from /usr/src/linux/include/linux/module.h:10, from hello.c:1: /usr/src/linux/include/linux/thread_info.h:53:29: fatal error: asm/thread_info.h: file not found

於是我意識到我錯了,但是爲什麼呢? T_T

回答

7
obj-m += hello.o 

all: 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 

clean: 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean 

是構建模塊看到kbuild documentation

而且看到差異beetween你的編譯器調用,你可以

cat /lib/modules/$(shell uname -r)/build/Makefile 

並分析輸出

1

asm應該是您正在編譯的實際架構的鏈接,而不是asm-generic
您無法編譯通用內核模塊,該模塊可用於通用體系結構。您必須針對您要使用的特定架構進行編譯。

我不知道爲什麼asm不存在。應該創建它作爲配置過程的一部分。
如果以其他方式配置不完整,稍後可能會出現其他錯誤。

+0

刪除我已經檢查了3臺機器內核的src文件夾(3.2+)與Ubuntu,Fedora和gentoo,它們都不包含文件夾'asm'。所以我認爲這可能不是一個錯誤.. – 2012-02-29 08:17:12

+2

在我檢查過的Redhat中,'/ usr/src/kernels /.../include/asm'是一個到'asm-x86_64'的鏈接。 – ugoren 2012-02-29 10:43:49

2
obj-m += hello.o 

all: 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 

clean: 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean 

這裏hello.c是你的內核源文件。只需使用make來構建你的hello.ko模塊。

+3

我知道這可以工作,但爲什麼它不工作在我的方式? 「gcc -D__KERNEL__ -I/usr/src/linux/include/-DMODULE -Wall -O2 -c hello.c -o hello.o」 – 2012-02-29 09:26:59

-1

模塊編譯有道: asm/linkage.h文件未找到

這意味着這個特定的文件沒有在指​​定的DIR中找到,當我們在make中使用-I選項時,它會被指定。

我們可以將asm-generic鏈接到asm,如果所有頭文件都存在於asm-generic中,或者我們可以使用make utility

在構建內核模塊的情況下,首選Make實用程序。

在工作目錄中創建一個'Makefile'。閱讀的makefile或做其他事情之前指定

obj-m += hello.o 
all: 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 
clean: 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean 

使用-C選項將變爲DIR。

因此,爲了避免此錯誤,使用-C選項與DIR /lib/modules/$(shell uname -r)/build

通過這個程序將能夠找到所需的文件,你會得到hello.ko文件。

您可以添加此通過

sudo insmod hello.ko 

內核模塊同樣可以通過

sudo rmmod hello