2013年10月26日土曜日

Invalid module formatと格闘

Linuxデバイスドライバを作ってみようかな、と思い立って、Free Software Magazineのチュートリアルをウォークスルーしてみる。

曰く、まずは空のソースコードをコンパイルしてカーネルモジュールを作り、insmodしてみましょうと。
んで、カーネルモジュールのコンパイル時に、そのロード先と同じカーネルが必要とのこと。今回はクロスコンパイルではなくホストシステムをそのままターゲットにするので、ホストと同じカーネルのソースが必要になる。

ホストのLinuxバージョンは
とりあえずKernel/Compile - Community Ubuntu Documentationを参考に
ツール類のインストール
カーネル取得
終わるとカレントディレクトリの下にカーネルのディレクトリができるので、入る。
んで現システムで使われているconfigを持ってきてoldconfigした後、make。
ひとまずこれでビルドOK

ということで、カーネルモジュールを作ってみる。 # 移動、ソース作成
しかし
とのこと。
enakai00さんの記事によれば、vermagicの不整合がまずいらしい。

modinfoコマンドでカーネルモジュールを調べてみる。
う~ん、vermagicがちょいと新しくないか?
いまいちど、カーネルのディレクトリに行って、バージョンを確認してみる。手順はここのQA参考。
あれ、思ってたのと違うお。。
Makefileを見てみると、
うん、やっぱり変だな。

クレバーじゃないと思いつつ、カーネルのMakefileのバージョン指定を無理やり変えてビルドしてみる。
で、カーネルモジュールのディレクトリに移動してもう一度ビルド。それからmodinfoしてみる。 ということで、vermagicはそろったものの、insmodしてみると うーむ、以前状況は変わらず。

そんで悩んで行き着いたのがStack OverflowのこのQA。なんでも、
で行けるっぽい。調べてみると、このbuildってのは/usr/src/linux-headers-$(uname -r)へのシンボリックリンクになっている。linux-headersがインストールしてあればOKなんですな。
成功したぽい。

0 件のコメント:

コメントを投稿