模块间的符号引用实例
一、Makefile
加入obj-m :=func_dev.o export.o
二、加截顺序和卸载顺序
1.先加载func_dev.ko,再加载export.ko。。
2.与加载时相反,先卸载export.ko,再卸载func_dev.ko。
三、执行结果
1.加载func_dev.ko后执行
cat /proc/kallsyms |grep func_dev
出现以下内容
00000000 a func_dev.c [func_dev]
f8b91104 ? __mod_license34 [func_dev]
f8b060d0 r __ksymtab_func_sum [func_dev]
f8b060e8 r __kstrtab_func_sum [func_dev]
f8b060d8 r __ksymtab_func_var2 [func_dev]
f8b060f1 r __kstrtab_func_var2 [func_dev]
f8b060e0 r __ksymtab_func_var1 [func_dev]
f8b060fb r __kstrtab_func_var1 [func_dev]
00000000 a func_dev.mod.c [func_dev]
f8b9111c ? __mod_srcversion23 [func_dev]
f8b91140 ? __module_depends [func_dev]
f8b9114c ? __mod_vermagic5 [func_dev]
f8b07684 B func_var2 [func_dev]
f8b06500 d __this_module [func_dev]
f8b06000 t cleanup_module [func_dev]
f8b06010 t init_module [func_dev]
f8b06000 t func_exit [func_dev]
f8b07680 B func_var1 [func_dev]
c06a5848 u printk [func_dev]
f8b06010 t func_init [func_dev]
f8b06021 T func_sum [func_dev]
2.执行dmesg查看日志缓存中记录内容
func init...
export call init...
func_var1=3
func_var2=4
var3 =5
3+4+5=12
export call exit...
func exit...
实例源代码
export.c源码
#include
#include
#include
extern int func_var1;
extern int func_var2;
extern int func_sum(int var3);
int export_init(void)
{
printk("export call init...\n");
func_var1=3;
func_var2=4;
printk("%d+%d+5=%d\n",func_var1,func_var2,func_sum(5));
return 0;
}
void export_exit(void)
{
printk("export call exit...\n");
}
module_init(export_init);
module_exit(export_exit);
MODULE_LICENSE("Dual BSD/GPL");
func_dev.c源码
#include
#include
#include
int func_var1=0;
int func_var2=0;
int func_sum(int var3)
{
printk("func_var1=%d\n",func_var1);
printk("func_var2=%d\n",func_var2);
printk("var3 =%d\n",var3);
return (func_var1+func_var2+var3);
}
int func_init(void)
{
printk("func init...\n");
return 0;
}
void func_exit(void)
{
printk("func exit...\n");
}
EXPORT_SYMBOL(func_var1);
EXPORT_SYMBOL(func_var2);
EXPORT_SYMBOL(func_sum);
module_init(func_init);
module_exit(func_exit);
MODULE_LICENSE("Dual BSD/GPL");
Makefile源码
ifneq ($(KERNELRELEASE),)
obj-m :=func_dev.o export.o
else
PWD := $(shell pwd)
KVR := $(shell uname -r)
KERNELDIR := /lib/modules/$(KVR)/build/ #内核源码目录
all:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
rm -rf *.o *~core .depend .*.cmd *.ko *.mod.c .tmp_versions Module* modules*
endif
阅读(1465) | 评论(0) | 转发(0) |