「helloworld」カーネルモジュールの例をコンパイルしようとしています。ubuntu11.04、カーネル3.2.6、gcc4.5.2およびFedora16、カーネル3.2.7、gcc4.6.7で問題が見つかりました。
コード:
#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
エラー:
/usr/src/linux/include/linux/kernel.h:13:0、/usr/src/linux/include/linux/cache.h:4、/usr/src/linux/includeからインクルードされたファイル/linux/time.h:7、/usr/src/linux/include/linux/stat.h:60、/usr/src/linux/include/linux/module.h:10、hello.c: 1:/usr/src/linux/include/linux/linkage.h:5:25:致命的なエラー:asm/linkage.h:ファイルが見つかりません
次に、/ usr/src/linux/include /に「asm」という名前のフォルダーはありませんが「asm-generic」という名前のフォルダーがあります。そこで、「asm」から「asm-generic」へのソフトリンクを作成し、agailをコンパイルしました。
今回のエラーは次のとおりです。
/usr/src/linux/include/linux/preempt.h:9:0、/usr/src/linux/include/linux/spinlock.h:50、/usr/src/linux/includeからインクルードされたファイル/linux/seqlock.h:29、/usr/src/linux/include/linux/time.h:8から、/ usr/src/linux/include/linux/stat.h:60から、/ usr/srcから/linux/include/linux/module.h:10、hello.c:1から:/usr/src/linux/include/linux/thread_info.h:53:29:致命的なエラー:asm/thread_info.h:ファイルではありません見つかった
だから私は自分が間違っていることに気づきましたが、なぜですか? T_T
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ドキュメント を参照してください。
そして、コンパイラの呼び出しの違いを確認するには、
cat /lib/modules/$(Shell uname -r)/build/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
ここで、hello.cはカーネルソースファイルです。 makeを使用してhello.koモジュールをビルドするだけです。
asm
は、asm-generic
ではなく、コンパイルする実際のアーキテクチャへのリンクである必要があります。
ジェネリックアーキテクチャで動作するジェネリックカーネルモジュールをコンパイルすることはできません。使用する特定のアーキテクチャ用にコンパイルする必要があります。
なぜasm
が存在しなかったのかわかりません。構成プロセスの一部として作成する必要があります。
他の方法で構成が不完全な場合、後で他のエラーが発生する可能性があります。
asm include(linkage.hなど)はアーキテクチャ固有です。以下の下にディレクトリのセットがあるはずです:
/usr/src/kernels/(kernel version goes here)/Arch
コンパイル対象のコードを対象とする特定のCPUアーキテクチャに特定のインクルードを提供します。
これをMakefileに追加してみてください。
KVERSION :=R(Shell uname -r)
カーネルとアーキテクチャ(この例ではx86)を追加します。
INCDIRS = -I./include -I/usr/src/kernels/$(KVERSION)/include -I/usr/src/kernels/$(KVERSION)/Arch/x86