私は初心者で、Linuxでのカーネルプログラミングの基本をいくつか試しています。今日の朝、VIMでmodule.hファイルを開き、変更も保存せずに閉じました。その後、私はコードをコンパイルできません。次のエラーメッセージが表示される
[root@localhost helloworld]# cc helloworld.c
helloworld.c:1:25: error: linux/module.h: No such file or directory
[root@localhost helloworld]#
以下は、最終日まで正常に実行されていたサンプルコードです。
#include<linux/module.h>
#include<linux/kernel.h>
int init_module(void)
{
printk("HELLO WORLD");
return 0;
}
void cleanup_module(void)
{
printk("GOODBYE");
}
私は次のようにmodule.hファイルを検索しましたが、存在します
[root@localhost usr]# find . -name module.h
./src/kernels/2.6.18-194.el5-i686/include/asm-x86_64/module.h
./src/kernels/2.6.18-194.el5-i686/include/asm-i386/module.h
./src/kernels/2.6.18-194.el5-i686/include/linux/module.h
./include/sepol/policydb/module.h
./include/sepol/module.h
./include/kde/kunittest/module.h
[root@localhost usr]#
私を助けてください。仮想ボックスでCentOSを使用しています。
周囲のkbuildフレームワークを含まないプレーンなgcc
でモジュールをコンパイルしようとしています。あなたはこのアプローチで過去に何かを働かせたかもしれませんが、pure-kbuild Makefile
アプローチ以外のものを使用してモジュールを維持しようとするのはpainfulひどいです。私はkbuildとの戦いで人生の多くを無駄にしてきました。同じことがあなたに起こってほしくありません-kbuildを受け入れて、あなたがあなたのモジュールを構築するのを手伝ってください。別のコード行を書く前にDocumentation/kbuild/modules.txt
を読んでください。
あなたがする必要があるのはあなたのモジュールのためのMakefile
を作成することです。その内容は次のようになります。
ifneq ($(KERNELRELEASE),)
# kbuild part of makefile
obj-m := modulename.o
else
# normal makefile
KDIR ?= /lib/modules/`uname -r`/build
default:
$(MAKE) -C $(KDIR) M=$$PWD
endif
慣れているほとんどのMakefile
sよりもはるかに複雑であることは知っていますが、これには2つの目的があります。ディレクトリでmake
を実行すると、make
が再起動され、現在実行中のカーネルからkbuildメカニズムが使用されます(少なくとも/lib/modules/.../build
から正しいリンクへのシンボリックリンクがあると想定されます)。ロケーション)。
再度呼び出されたmake
コマンド($(MAKE)
)は、モジュールを適切にビルドし、これまで以上に時間を節約します。 (本当に。)
この作業を行う間、Documentation/kbuild/modules.txt
を傍らに置いてください。
注:Documentation/kbuild/modules.txt
は、Linuxシステムの/usr/share/linux-headers-$(uname -r)/Documentation/kbuild/modules.txt
で利用できる場合があります
Kernel-develパッケージをインストールします。
yum install kernel-devel
その後、次のものが必要です。
/usr/src/kernels/$kernelversion/include/linux/module.h
その後、次のようなものを渡すことができます:
-I/usr/src/kernels/$(uname -r)/include
コンパイラーへ
モジュールをコンパイルするためにMakefileが必要な場合があります。パーソナルコンピュータ(Ubuntu 10.04.4)で試してみましたが、gcc -c hello.c
を使用しても同じ問題が発生しますが、Makefileを使用すると、すべて問題ありません。カーネルバージョンは2.6.32-54-genericです