作者 主題: 請教一個make kernel module的問題  (閱讀 9247 次)

0 會員 與 1 訪客 正在閱讀本文。

ahan

  • 可愛的小學生
  • *
  • 文章數: 3
    • 檢視個人資料
請教一個make kernel module的問題
« 於: 2008-09-03 03:17 »
小弟試著將兩個.c檔make成一個.ko模組
結果出現以下錯誤訊息:

代碼: [選擇]
make -C /lib/modules/`uname -r`/build SUBDIRS=/mnt/hgfs/ldd3/ch2/test modules
make[1]: Entering directory `/usr/src/kernels/2.6.18-53.el5-i686'
  CC [M]  /mnt/hgfs/ldd3/ch2/test/./hello_module.o
/mnt/hgfs/ldd3/ch2/test/./hello_module.c: In function ‘hello_init’:
/mnt/hgfs/ldd3/ch2/test/./hello_module.c:7: error: implicit declaration of function ‘hello’
/mnt/hgfs/ldd3/ch2/test/./hello_module.c: In function ‘__exittest’:
/mnt/hgfs/ldd3/ch2/test/./hello_module.c:20: warning: return from incompatible pointer type
make[2]: *** [/mnt/hgfs/ldd3/ch2/test/./hello_module.o] Error 1
make[1]: *** [_module_/mnt/hgfs/ldd3/ch2/test] Error 2
make[1]: Leaving directory `/usr/src/kernels/2.6.18-53.el5-i686'
make: *** [default] Error 2

應該是hello_module.c不知道hello()的存在吧
但是該怎麼處理這個狀況,小弟我沒有半點頭緒
能不能請哪位前輩指點一下,謝謝

Makefile
代碼: [選擇]
KDIR := /lib/modules/`uname -r`/build
PWD := $(shell pwd)

obj-m := hello.o
hello-objs := ./hello_module.o ./hello_module_2.o

default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules


Hello_module.c
代碼: [選擇]
#include <linux/init.h>
#include <linux/module.h>

static int __init hello_init(void)
{
//printk(KERN_ALERT "Hello World...init\n");
hello();

return (0);
}

static int __exit hello_exit(void)
{
printk(KERN_ALERT "Hello World...exit\n");

return (0);
}

module_init(hello_init);
module_exit(hello_exit);


Hello_module_2.c
代碼: [選擇]
#include <linux/init.h>
#include <linux/module.h>

void hello()
{
printk(KERN_ALERT "Hello World...init.\n");
}

« 上次編輯: 2008-09-03 03:25 由 ahan »

elleryq

  • 鑽研的研究生
  • *****
  • 文章數: 908
  • 性別: 男
    • 檢視個人資料
    • Thinking more...
回覆: 請教一個make kernel module的問題
« 回覆 #1 於: 2008-09-03 09:16 »

在 #include 之後,加上 void hello();
先行告知編譯器有這麼一個 function 存在即可.
Plan your work, then work your plan.
我的首頁:http://blog.elleryq.idv.tw
351899by http://counter.li.org

ahan

  • 可愛的小學生
  • *
  • 文章數: 3
    • 檢視個人資料
回覆: 請教一個make kernel module的問題
« 回覆 #2 於: 2008-09-03 13:22 »
感謝elleryq的回答 :)
我在hello_module.c中加上prototype的宣告之後就可以編譯成功了

代碼: [選擇]
make -C /lib/modules/`uname -r`/build SUBDIRS=/mnt/hgfs/codes/test modules
make[1]: Entering directory `/usr/src/kernels/2.6.18-53.el5-i686'
  CC [M]  /mnt/hgfs/codes/test/./hello_module.o
  CC [M]  /mnt/hgfs/codes/test/./hello_module_2.o
  LD [M]  /mnt/hgfs/codes/test/hello.o
  Building modules, stage 2.
  MODPOST
  CC      /mnt/hgfs/codes/test/hello.mod.o
  LD [M]  /mnt/hgfs/codes/test/hello.ko
make[1]: Leaving directory `/usr/src/kernels/2.6.18-53.el5-i686'

但是這邊小弟還有一個問題想請教

hello.c
代碼: [選擇]
#include <stdio.h>

int main()
{
hello();

return (0);
}


hello_2.c
代碼: [選擇]
#include <stdio.h>

void hello()
{
printf("Hello World.\n");

return ;
}


在hello.c中並沒有宣告hello()的prototype
然而卻是可以順利編譯的
gcc -c ./hello.c
gcc -c ./hello_2.c
gcc -o ./hello ./hello.o ./hello_2.o

這邊小弟腦袋一直轉不過來
能不能麻煩前輩指教小弟觀念的錯誤之處?

謝謝

elleryq

  • 鑽研的研究生
  • *****
  • 文章數: 908
  • 性別: 男
    • 檢視個人資料
    • Thinking more...
回覆: 請教一個make kernel module的問題
« 回覆 #3 於: 2008-09-04 09:13 »
跟 gcc 加的參數有關係

你改為
gcc -c -Wall -Werror hello.c
gcc -c -Wall -Werror hello_2.c

就可以發現 hello.c 編譯不過,跟 kernel 的情況一樣...
Plan your work, then work your plan.
我的首頁:http://blog.elleryq.idv.tw
351899by http://counter.li.org

ahan

  • 可愛的小學生
  • *
  • 文章數: 3
    • 檢視個人資料
回覆: 請教一個make kernel module的問題
« 回覆 #4 於: 2008-09-06 13:57 »
原來如此
我想我應該瞭解這個狀況了
感謝前輩的熱心指導
謝謝 :)