关于EXPORT_SYMBOL的作用浅析

原创 2012年09月20日 09:06:11

在查看内核驱动代码的时候会经常看到在一些函数后面总会跟EXPORT_SYMBOL()这样的宏定义,通过网上查阅,它的作用大致总结如下:

1、定义说明

     把内核函数的符号导出,也可以理解成将函数名作为符号导出;符号的意思就是函数的入口地址,或者说是把这些符号和对应的地址保存起来的,在内核运行的过程中,可以找到这些符号对应的地址的。

2、相关处理

     (1)、对编译所得的.ko进行strip -S,处理掉调试信息,这样可以大大缩小ko文件的大小;

     (2)、使用KBUILD_EXTRA_SYMBOLS

主要使用于下面这样的场合:

有两个我们自己的模块,其中Module B使用了Module A中的export的函数,因此在Module B的Makefile文件中必须添加:

KBUILD_EXTRA_SYMBOLS += /path/to/ModuleA/Module.symvers

export KBUILD_EXTRA_SYMBOLS

这样在编译Module B时,才不会出现Warning,提示说func1这个符号找不到,而导致编译得到的ko加载时也会出错。

// Module A (mod_a.c)
#include<linux/init.h>
#include<linux/module.h>
#include<linux/kernel.h>

static int func1(void)
{
       printk("In Func: %s...\n",__func__);
       return 0;
}

// Export symbol func1
EXPORT_SYMBOL(func1);

static int __init hello_init(void)
{
       printk("Module 1,Init!\n");
       return 0;
}

static void __exit hello_exit(void)
{
       printk("Module 1,Exit!\n");
}

module_init(hello_init);
module_exit(hello_exit);
// Module B (mod_b.c)
#include<linux/init.h>
#include<linux/kernel.h>
#include<linux/module.h>

static int func2(void)
{
       extern int func1(void);
       func1();
       printk("In Func: %s...\n",__func__);
       return 0;
}

static int __init hello_init(void)
{
       printk("Module 2,Init!\n");
       func2();
       return 0;
}

static void __exit hello_exit(void)
{
       printk("Module 2,Exit!\n");
}

module_init(hello_init);
module_exit(hello_exit);


 

Linux内核—EXPORT_SYMBOL宏的使用

前言 EXPORT_SYMBOL宏的使用时出现在Linux-2.6之后,在Linux-2.4内核中,默认的非static 函数和变量都会自动导入到kernel 空间, 都不用EXPORT_SYMBO...
  • zengxianyang
  • zengxianyang
  • 2016年01月30日 17:41
  • 4019

谈EXPORT_SYMBOL使用

EXPORT_SYMBOL只出现在2.6内核中,在2.4内核默认的非static 函数和变量都会自动导入到kernel 空间的, 都不用EXPORT_SYMBOL() 做标记的。2.6就必须用EXPO...
  • macrossdzh
  • macrossdzh
  • 2009年09月27日 17:15
  • 42970

关于EXPORT_SYMBOL的作用浅析

在查看内核驱动代码的时候会经常看到在一些函数后面总会跟EXPORT_SYMBOL()这样的宏定义,通过网上查阅,它的作用大致总结如下: 1、定义说明      把内核函数的符号导出,也可以理解成将...
  • kwame211
  • kwame211
  • 2017年09月14日 09:10
  • 195

c语言EXPORT_SYMBOL

EXPORT_SYMBOL 模块可以使用如下宏导出符号到内核符号表: EXPORT_SYMBOL(符号名);    EXPORT_SYMBOL_GPL(符号名)  EXPORT_SYMBOL_G...
  • hjwsm1989
  • hjwsm1989
  • 2016年09月29日 21:04
  • 423

Linux驱动开发——EXPORT_SYMBOL的使用

编写C程序时,如果需要使用某个外部的函数,通常的做法是 #include 包含该函数原型(prototype)的头文件,然后在程序中进行调用。经过编译链接后,程序就能顺利调用该函数。但是对于内核模块来...
  • luckydarcy
  • luckydarcy
  • 2016年05月18日 03:46
  • 763

关于EXPORT_SYMBOL

linux2.6的“/prob/kallsyms”文件对应着内核符号表,记录了符号以及符号所在的内存地址。模块可以使用如下宏导出符号到内核符号表:EXPORT_SYMBOL(符号名);EXPORT_S...
  • lisan04
  • lisan04
  • 2009年04月15日 15:43
  • 18598

linux3.10被ko引用的全局变量需要EXPORT_SYMBOL

linux3-4及之前定义的一个变量只要被某个不是module的c文件声明就可以,现在linux3.10之后发现必须得EXPORT_SYMBOL。否则会提示类似 ERROR: “g_Scre...
  • little_walt
  • little_walt
  • 2016年12月04日 09:19
  • 348

驱动模块中EXPORT_SYMBOL和EXPORT_SYMBOL_GPL

一个模块mod1中定义一个函数func1;在另外一个模块mod2中定义一个函数func2,func2调用func1。 在模块mod1中,EXPORT_SYMBOL(func1); 在模块mod2中...
  • wangweiqiang1325
  • wangweiqiang1325
  • 2016年06月02日 19:06
  • 560

linux KO使用内核export_symbol

EXPORT_SYMBOL标签内定义的函数或者符号对全部内核代码公开,不用修改内核代码就可以在您的内核模块中直接调用,即使用EXPORT_SYMBOL可以将一个函数以符号的方式导出给其他模块使用。您还...
  • shenhuxi_yu
  • shenhuxi_yu
  • 2017年04月18日 16:48
  • 400

linux模块导出符号 EXPORT_SYMBOL_GPL EXPORT_SYMBOL

一个模块mod1中定义一个函数func1;在另外一个模块mod2中定义一个函数func2,func2调用func1。 在模块mod1中,EXPORT_SYMBOL(func1); 在模块mod2中...
  • angle_birds
  • angle_birds
  • 2012年03月26日 21:29
  • 22134
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于EXPORT_SYMBOL的作用浅析
举报原因:
原因补充:

(最多只允许输入30个字)