参考资料:
https://blog.csdn.net/zhangskd/article/details/9025121
http://blog.chinaunix.net/uid-20543672-id-3023148.html
http://ilinuxkernel.com/?p=559
现象描述:
创建两个module(module_1, module_2)
module_1中: int __test_aa = 10; EXPORT_SYMBOL(__test_aa); module_2中: printk(KERN_INFO "%d\n", __test_aa);
先加载module_1,后加载module_2,加载module_2时候提示错误
insmod: ERROR: could not insert module hello2.ko: Invalid parameters
原因:
简单说来,就是小b生成的时候不知道小a symbol的校验码,小b加载的时候自然check 校验码出错。
解决方案:
这是linux kernel 2.6.26 之后版本的bug (详细描述, 请看http://bugzilla.kernel.org/show_bug.cgi%3Fid%3D12446)
并且这个bug不会被fix
解决办法是把mod_a的Module.symvers放到mod_b的当前路径,从而编译mod_b,符号信息会自动连接进去.
或者在mod_b的makefile中使用KBUILD_EXTRA_SYMBOLS指定mod_a的Module.symvers, 如:
KBUILD_EXTRA_SYMBOLS=/mod_a/Module.symvers
编译mod_b时,搜索Module.symvers的路径是:
1, kernel source path, e.g. /usr/src/kernels/linux-2.6.28.10
2, makefile中M=所指定的路径, 它等效于变量KBUILD_EXTMOD的值
3, 变量KBUILD_EXTRA_SYMBOLS的值
经验证生效。
补充知识(调试时候可能会用到):
内核符号表:
静态的符号表,即内核映像vmlinuz的符号表(System.map)
动态的符号表,即内核模块的符号表(/proc/kallsyms)
符号标志
T External text
t Local text
D External initialized data
d Local initialized data
B External zeroed data
b Local zeroed data
A External absolute
a Local absolute
U External undefined
G External small initialized data
g Local small initialized data
I Init section
S External small zeroed data
s Local small zeroed data
R External read only
r Local read only
C Common
E Small common