extern和EXPORT_SYMPOL

原创 2013年12月04日 22:37:32

今天又看了看linux的内核的东西,发现很多函数后面都会加上一句EXPORT_SYMPOL()这样的函数,所以今天学习了这样一个函数,以及它和extern的关系。

EXPORT_SYMPOL是2.6内核才有的,作用是什么呢?网上给出的答案是:EXPORT_SYMBOL标签内定义的函数或者符号对全部内核代码公开,不用修改内核代码就可以在您的内核模块中直接调用,即使用EXPORT_SYMBOL可以将一个函数以符号的方式导出给其他模块使用。可以理解为,这个函数在其他地方也可以被调用。extern的解释:在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。下面还是看看用法吧,知道怎么用更靠谱一些。第一、在模块函数定义之后使用EXPORT_SYMBOL(函数名)。第二、在调用该函数的模块中使用extern对之声明。第三、首先加载定义该函数的模块,再加载调用该函数的模块。参考例子如下

mod1.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);
 
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);
 
 
#############################################################
mod2.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);
 
################################################################
Makefile
ifneq ($(KERNELRELEASE),)
obj-m   := XXXX.o
else
KDIR    := /lib/modules/$(shell uname -r)/build
PWD             := $(shell pwd)
 
default:
        $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
 
clean:
        rm -rf Module.symvers *.ko *.o *.mod.c .*.cmd .tmp_versions
 
endif
 
################################################################
 
#insmod ./mod1.ko
#insmod ./mod2.ko
#rmmod mod2
#rmmod mod1
 
Jan 11 11:59:17 wangyao-desktop kernel: [ 9886.801010] Module 2,Exit!
Jan 11 11:59:21 wangyao-desktop kernel: [ 9891.450214] Module 1,Exit!
Jan 11 12:05:29 wangyao-desktop kernel: [10258.385014] Module 1,Init!
Jan 11 12:05:38 wangyao-desktop kernel: [10267.465923] Module 2,Init!
Jan 11 12:05:38 wangyao-desktop kernel: [10267.465928] In Func: func1...
Jan 11 12:05:38 wangyao-desktop kernel: [10267.465930] In Func: func2...
Jan 11 12:05:50 wangyao-desktop kernel: [10280.091755] Module 2,Exit!
Jan 11 12:05:57 wangyao-desktop kernel: [10287.332596] Module 1,Exit!
 


可见,在mod2中的func2函数成功的调用了mod1中的func1函数。


extern ”C"的使用

本文分析extern “C”的使用方法;介绍C++和C文件相互调用的方式。 extern "C"           extern "C" 包含双重含义,从字面上即可得到:首先,被它修饰的目标是“ex...
  • u013074465
  • u013074465
  • 2015年01月15日 11:10
  • 5081

C++基础篇—函数重载与Extern C

问题引出     之前提到C存在命名冲突问题,新的C++专门为此引入了namespace机制加以改进(后文介绍),此外还有另一种机制:     int add(int i, int j) {    r...
  • ipmux
  • ipmux
  • 2015年02月27日 18:23
  • 1564

名字修饰约定extern "C"与extern "C++"浅析

所谓名字修饰约定,就是指变量名、函数名等经过编译后重新输出名称的规则。   比如源代码中函数名称为int Func(int a,int b),经过编译后名称可能为?Func@@YAHHH@Z、?Fu...
  • BeanJoy
  • BeanJoy
  • 2013年06月20日 13:44
  • 8923

extern ,EXPORT_SYMBOL

///////////////////////a.c #include void fun(void); int var_public_b=1;// int main() { printf ("main...
  • songqqnew
  • songqqnew
  • 2011年08月02日 17:25
  • 500

关键字const static 以及extern(export)

1)在函数体内,一个被声明为静态的变量在这一函数被调用过程中维持其值不变(该变量存放在静态变量区)。 设置变量的存储域,函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只...
  • sky_person
  • sky_person
  • 2015年02月04日 17:35
  • 652

【C语言】混合编程中的export 、import和extern

【IMPORT 】:   语法格式:   IMPORT 符号 {[WEAK]}   IMPORT 伪操作告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的,在本源文件中可能...
  • simanstar
  • simanstar
  • 2014年03月28日 11:18
  • 2464

混合编程中的export 、import和extern

http://flashcs3.blog.163.com/blog/static/19972031420133211634888/ 【IMPORT 】:   语法格式:    IMP...
  • u013566722
  • u013566722
  • 2016年08月09日 01:07
  • 590

使用extern &quot;C&quot;改善显式调用dll的例子 (c++)

  • 2016年04月04日 12:07
  • 23.91MB
  • 下载

C++关键词—extern本质

  • 2007年10月06日 16:40
  • 24KB
  • 下载

extern C详细解释

  • 2007年09月03日 16:28
  • 56KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:extern和EXPORT_SYMPOL
举报原因:
原因补充:

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