内核符号导出,内核模块版本不匹配时

/proc/kallsyms 记录了内核中所有导出的符号的名字与地址.

导出内核符号的意义

内核之间有依赖关系的时候需要导出被依赖的函数

此例中有2个内核模块 calculate.c 和 hello.c

hello.c

#include <linux/module.h>
#include <linux/init.h>

MODULE_LICENSE("GPL");

extern int add_integar(int a, int b);
extern int sub_integar(int a, int b);

static int __init hello_init()
{
  int res = add_integar(1,2);   //用到add_integar()函数
  return 0;
} 

static int __exit hello_exit()
{
  int res = sub_integar(2,1);  //用到sub_integar()函数,这两个函数在calculate.c内核模块中
}

module_init( hello_init);
module_exit( hello_exit); 

calculate.c

#include <linux/module.h>
#include <linux/init.h>

MODULE_LICENSE("GPL");

int add_integar(int a, int b)
{
  return a+b;
}

int sub_integar(int a, int b)
{
  return a-b;
}

static int __init sym_init()
{
  return 0;
} 

static int __exit sym_exit()
{
 
}

module_init( sym_init);
module_exit( sym_exit);

EXPORT_SYMBOL(add_integar);  //EXPORT_SYMBOL()导出add_integar函数和sub_integar
EXPORT_SYMBOL(sub_integar);  

EXPORT_SYMBOL_GPL(符号名)

只能用于包含GPL许可证的模块.

EXPORT_SYMBOL(符号名)

用于导出内核符号使用

内核模块常见问题 版本不匹配

uname -r

查看内核版本

modprobe --force-modversion    //强行插入,不推荐