web-dev-qa-db-ja.com

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

「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

12
Raiden Awkward
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

そして、出力を分析します

9
2r2w
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
Barun Parichha

asmは、asm-genericではなく、コンパイルする実際のアーキテクチャへのリンクである必要があります。
ジェネリックアーキテクチャで動作するジェネリックカーネルモジュールをコンパイルすることはできません。使用する特定のアーキテクチャ用にコンパイルする必要があります。

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

1
ugoren

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
0
Jay Elston