お知らせ

  • 利用規約を守って投稿してください。また、よくある質問および投稿の手引きも参照してください。
  • メッセージの投稿にはアカウントが必要です。未登録の方は、ユーザ登録ページからアカウントを作成することができます。

#1 2009-12-15 09:46:50

o_jiji
メンバ
登録日: 2009-08-27

デバイスドライバのコンパイルが通りません

 学習のため、Ubuntu9.04で簡単なデバイスドライバ作成サンプルをコンパイルしましたが、"hello.c"のコンパイルが通りません。 参考にしたサンプルソースは、webページの「How to: Compile Linux kernel modules」です。

 make hello とタイプすると、インクルードパスにファイルがないと叱られてしまいます。

最初のエラー出力:
 error: linux/module.h: No such file or directory

 標準のインクルードパスは/usr/include/linuxだと思いますが、ここにmodule.hはありません。 でも、/usr/srcにはカレントバージョン用のlinux-headers-2.6.28-17-genericがあります。 そのなかの、include/linuxにはmodule.hがあります。 インクルードパスがここに届いていないのが原因のようです。

Makefileの内容は下記のとおりです。

obj-m = hello.o
KVERSION = $(shell uname -r)
all:
        make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
clean:
        make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean

 makeの中からmakeしているので、このMakefileの本体が/lib/modules/2.6.28-17-generic/build/にあるのは確認しました。

 このMakefileの中で、先ほどのインクルードパスの設定を指定しているのだと思いますが、どこをいじればよいのかわかりません。
/usr/include/linuxをカレントバージョンのソースで上書きすればコンパイルが通る気もしますが、後戻りできなさそうで躊躇しています。

 皆さんの環境ではいかがでしょうか、なにかアドバイスをよろしくお願いします。

オフライン

 

#2 2009-12-15 11:12:11

weyk
メンバ
登録日: 2009-04-03

Re: デバイスドライバのコンパイルが通りません

1点だけ。

/usr/include/linuxをカレントバージョンのソースで上書きすればコンパイルが通る気もしますが、後戻りできなさそうで躊躇しています。

 カーネルやモジュールの構築にのみ必要なヘッダーファイルは、/usr/includeの下には移されません。もともとインストールした場所である、/usr/src/linux-headers-2.6.31-14-generic/include/linux といったような場所のまま利用されます(カーネルのバージョン番号は個々の環境で異なる可能性があります)。移動してしまうと、予期せぬ問題が発生する可能性がありますから、行わないよう注意してください。

 この辺の必要なパスをかき集めて指定するのは、buildというmakefileがうまく扱ってくれている・・・と思うのですが、中を見たことが無いので詳細は不明です。
 もし、実際に実行されていると思われる、コンパイラのコマンド(cc なんたら か、gcc なんたら の、長い行全て)を見ることで、インクルードファイルのパスの指定がどうなっているのか(抜けているとか、存在しないパスを刺しているとか)、わかるかもしれません。

オフライン

 

#3 2009-12-15 14:31:56

o_jiji
メンバ
登録日: 2009-08-27

Re: デバイスドライバのコンパイルが通りません

weykさん、すばやい回答ありがとうございます。

じつは、いろいろ試しているうちに解決しました。
原因は2つありました。
(1)Makefileの内容をwebからコピペしたため、TABではなくスペースでインデントしていた。
(2)make の実行で、引数 hello は必要なかった。(makeだけでよい。)

(1)が最大の要因でしたが、わけも分からず引数helloで実行したため、とんちんかんなエラーが出てしまったようです。
下記がコンパイルの出力メッセージです。
$ make
make -C /lib/modules/2.6.28-17-generic/build M=/home/my/gcc/mod-1 modules
make[1]: ディレクトリ `/usr/src/linux-headers-2.6.28-17-generic' に入ります
  CC [M]  /home/my/gcc/mod-1/hello.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/my/gcc/mod-1/hello.mod.o
  LD [M]  /home/my/gcc/mod-1/hello.ko
make[1]: ディレクトリ `/usr/src/linux-headers-2.6.2

原因が判るまで、いろんなものを apt-get してしまい、ディスクスペースを狭くしてしまいました。

オフライン

 

Board footer

Powered by FluxBB