我想編譯一個「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
刪除我已經檢查了3臺機器內核的src文件夾(3.2+)與Ubuntu,Fedora和gentoo,它們都不包含文件夾'asm'。所以我認爲這可能不是一個錯誤.. – 2012-02-29 08:17:12
在我檢查過的Redhat中,'/ usr/src/kernels /.../include/asm'是一個到'asm-x86_64'的鏈接。 – ugoren 2012-02-29 10:43:49