こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

LKMの分割コンパイルについて

こんばんは、自分は今LKMの分割コンパイルに挑戦しています。
以下のようなファイルを作成して、モジュールを作ってみました。

[Makefile]
obj-m:= message.o
message-objs:= message.o sample_func.o

KDIR:= /lib/modules/$(shell uname -r)/build
PWD:= $(shell pwd)

all:
$(MAKE) -C $(KDIR) M=$(PWD) modules

clean:
rm -f *.o *.ko *.symvers *~ *.mod.c

[message.c]
#include <linux/module.h>
#include <linux/kernel.h>
#include "sample_func.h"

static char *msg = "[message.o]:";

static int message_module(void)
{
printk(KERN_INFO "%s loaded\n",msg);
printk(KERN_INFO "%s %d\n", msg, sample_add(2,3));
return 0;
}

static void message_remove(void)
{
printk(KERN_INFO "%s removed\n", msg);
}

module_init(message_module);
module_exit(message_remove);

[sample_func.c]
#include "sample_func.h"

static int inner_add(int,int);

int sample_add(int a, int b)
{
return inner_add(a,b);
}

static int inner_add(int a, int b)
{
return a+b;
}

[sample_func.h]
int sample_add(int,int);


コンパイルは正しく通るようなのですが、/var/log/messages に何も出力がありません。
(KERN_INFOを指定しているので/var/log/messagesに出力されると思っているのですが。。。)
lsmodで確認したところ、モジュールはカーネル内に正常に組み込まれているようでした。
どなたか解決方法をご存知の方教えていただけないでしょうか。
宜しくお願いします。

投稿日時 - 2009-01-23 23:32:25

QNo.4655539

すぐに回答ほしいです

質問者が選んだベストアンサー

こんにちは。
前回と同じ回答になってしまいますが、
もう少し名前の付け方を工夫された方が良いかと。

obj-m <= lsmodするモジュール名を指定
(モジュール名)-objs <= モジュールを構成するオブジェクトファイル(ソース)を指定
のような感じになるので、

> obj-m := message.o
> message-objs := message.o sample_func.o

だと、message.ko は messege.c のみから構成されて sample_func.c がリンクされていない状況だと思います。

作りたいモジュールを message.ko だとするならば、
obj-m := message.o
message-objs := message-main.o sample_func.o
のようにして、message-main.c と sample_func.c を作るのが良いかと。
逆に、カーネルモジュールの名前を変更して、
obj-m := msg.o
msg-objs := message.o sample_func.o
のようにしても良いかと思います。

投稿日時 - 2009-01-26 09:52:13

お礼

前回に続いて今回もお答えいただきありがとうございました。
この方法で無事に実行することができました。
ネーミングでひっかかってることに気がつかなかったので、
名前の付け方をもう一度見直そうと思います。

投稿日時 - 2009-01-29 01:24:26

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問