私はUbuntuで作業しています。私は、お互いの機能を使用する2つのカーネルモジュールを作ろうとしています。私の問題は、適切にコンパイルされたモジュールが得られていることです。しかし、シンボルはそれらのいずれかで解決されません。別のモジュールで定義されているシンボルの "Unknown symbol in module"でinsmodが失敗する
これらのモジュールをm1
とm2
と呼びましょう。
m2輸出機能void func_m2(void)
です。 m1
がこの関数を呼び出しています。両方のモジュールが適切にコンパイルされます。
すべてコンパイルした後、最初にm2
モジュールをロードする必要があります(func_m2
関数をエクスポートしたため)。その後はm1
モジュールをロードする必要があります。それでは、それを作ってみましょう:
[email protected]:~/development/kmodules/m2$ sudo insmod ./m2.ko
は今、func_m2
を使用しようとしているロードm1
モジュールができます:
[email protected]:~/development/kmodules/m1$ sudo insmod ./m1.ko
insmod: error inserting './m1.ko': -1 Unknown symbol in module
次は私がログに見えるものです:だから
[email protected]:~/development/kmodules/m1$ dmesg | tail
[ 3938.166616] Loading m2 module ...
[ 3963.078055] m1: no symbol version for func_m2
[ 3963.078059] m1: Unknown symbol func_m2
、シンボルfunc_m2
への参照が解決されていないようです。面白い。それはシンボルテーブルに存在する場合のは確認してみましょう:あなたが見ることができるように、func_m2
はシンボルテーブルに実際に存在している
[email protected]:~/development/kmodules$ cat /proc/kallsyms | grep 'func_m2'
ffffffffa00530d0 r __ksymtab_func_m2 [m2]
ffffffffa00530e8 r __kstrtab_func_m2 [m2]
ffffffffa00530e0 r __kcrctab_func_m2 [m2]
ffffffffa0053000 T func_m2 [m2]
000000004edd543f a __crc_func_m2 [m2]
。だからなぜm1
をロードできませんか?
カーネルとLinuxのソース用に適切なLinuxヘッダーをインストールしました。 2.6.31-16-generic(私はx64を実行します)
ここでは、完全な画像を表示するために、ここにソースコードとMakefileを入れています。私はm1
とm2
の両方のモジュールでこのテストに使用しました。
m1
モジュール:
m1.c:
#include <linux/module.h>
#include <linux/kernel.h>
extern void func_m2(void);
int hello_start(void)
{
printk(KERN_INFO "Loading m1 module ...\n");
func_m2();
return 0;
}
void hello_end(void)
{
printk(KERN_INFO "Unloading m1 ...\n");
}
module_init(hello_start);
module_exit(hello_end);
MODULE_LICENSE("GPL");
のMakefile:
obj-m := m1.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
m2
モジュール:
のm2.c:
#include <linux/module.h>
#include <linux/kernel.h>
int hello_start(void)
{
printk(KERN_INFO "Loading m2 module ...\n");
return 0;
}
void hello_end(void)
{
printk(KERN_INFO "Unloading m2 ...\n");
}
void func_m2(void)
{
printk(KERN_INFO "This a function in m2\n");
}
module_init(hello_start);
module_exit(hello_end);
MODULE_LICENSE("GPL");
EXPORT_SYMBOL(func_m2);
のMakefile:
obj-m := m2.o
export-objs := m2.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
基本的に私の質問をされていますはなぜm1
をロードすることはできませんか?
誰かが答えることができれば助かります。
https://serverfault.com/questions/124128/linux-says-a-kernel-module-has-an-unknown-symbol-but-another-loaded-module-prov –