2012-02-29 85 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

を参照してくださいそして、あなたは

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

できたあなたのコンパイラー呼び出しbeetween違いを参照して出力

1

asmは、コンパイルする実際のアーキテクチャへのリンクであり、asm-genericではありません。
汎用アーキテクチャーで動作する汎用カーネルモジュールをコンパイルすることはできません。あなたはあなたが使用しようとしている特定のアーキテクチャのためにそれをコンパイルする必要があります。

asmが存在しなかった理由はわかりません。これは構成プロセスの一部として作成する必要があります。
設定が他の方法で不完全な場合は、後で他のエラーが発生することがあります。

+0

により削除することができます

sudo insmod hello.ko 

によってモジュールをカーネルにこれを追加することができますgentoo、それらのすべてにはフォルダ 'asm'が含まれていません。だから私はそれがエラーではないと思う。 –

+2

私がチェックしたRedhatでは '/ usr/src/kernels /.../ include/asm'は' asm-x86_64'へのリンクです。 – ugoren

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" –

-1

モジュールのコンパイルを分析します: asm/linkage.hファイルが見つかりません

これは、この特定のファイルが指定されたDIRに見つかりませんでした。これは、makeで-Iオプションを使用したときに指定されます。

すべてのヘッダーがasm-genericに存在する場合は、asm-genericにリンクするか、makeユーティリティを使用します。

カーネルモジュールをビルドする場合は、makeユーティリティが優先されます。

作業ディレクトリに「Makefile」を作成します。-Cオプションの

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 

使用すると、メイクファイルを読んだり、何かを行う前に、指定されたDIRに変更されます。

だから、このエラーを回避するために、必要なファイルを見つけることができるようになります。このプログラムでは

DIR /lib/modules/$(shell uname -r)/buildで-Cオプションを使用して、あなたはhello.koファイルを取得します。

あなたは同様にあなたは、私は、Ubuntuのと3台のマシン上でカーネルのsrcフォルダ(3.2以上)をチェックFedoraとしました

sudo rmmod hello 
関連する問題