模块1需要使用模块2的函数,但是有时候install 后出现Unknown symbol.以下是查到的资料 (1) Compiling 2 modules a.ko and b.ko ( dependent on a.ko ) together :- Works
(2) Copying Module.symvers from module "a" dir to the module "b" dir, before
compiling b.ko :- Works.
(3) Modprobe after appending following lines in /lib/modules/modules.dep
/lib/modules/2.6.27.7-smp/kernel/drivers/net/a.ko
/lib/modules/2.6.27.7-smp/kernel/drivers/net/b.ko:
/lib/modules/2.6.27.7-smp/kernel/drivers/net/a.ko
:- Fails
(4) After compiling b.ko, just modifying b.mod.c file to include the undefined
symbol in its version table doesn't work (didn't expect to work ).
(5) export_objs (doesn't work):
In Makefile of a.ko:
export_objs := a.ko / export-objs := a.ko / exportobjs := a.ko.
(6) Adding "#define EXPORT_SYMTAB" in a.c file (doesn't work).
From above experiments, we found that In .mod.c file it maintains __versions
array, which contains export symbol name and its crc.
We see symbols of modules which are compiled with kernel. No symbols of
externally compiled modules.
The call trace is load_module -> simplify_symbols -> resolve_symbol ->
find_symbol and check_version ( if find_symbol succeeds ).
check_version behavior comparison in 2.6.26 and earlier version kernels :-
In earlier versions of kernel also, symbol couldn't be found in its version
table. Still, check_version used to
return 1 (success) and the dependent module could be insmod(ed) successfully.
However, in kernel 2.6.26 onwards, behavior has changed. check_version on not
finding the reqd. symbol in its version table returns 0 (fail) and the
dependent external module can't be inserted anymore
来自.
如果以后的方法你试过了还是不行,那么有可能是少加了MODULE_LICENSE("GPL");
当然最重要的是先确定模块2已经安装了。我之前就是在安装KVM_MOD的时没有先安装kvm.ko,直接安装kvm-intel.ko,出现了大量的UnKnowns symbol.
阅读(1015) | 评论(0) | 转发(0) |