EXPORT_SYMBOL只出现在2.6内核中,在2.4内核默认的非static 函数和变量都会自动导入到kernel 空间的, 都不用EXPORT_SYMBOL() 做标记的。
2.6就必须用EXPORT_SYMBOL() 来导出来(因为2.6默认不到处所有的符号)。

1、EXPORT_SYMBOL的作用
EXPORT_SYMBOL标签内定义的函数或者符号对全部内核代码公开,不用修改内核代码就可以在您的内核模块中直接调用,即使用EXPORT_SYMBOL可以将一个函数以符号的方式导出给其他模块使用。

这里要和System.map做一下对比:
System.map 中的是连接时的函数地址。连接完成以后,在2.6内核运行过程中,是不知道哪个符号在哪个地址的。
EXPORT_SYMBOL 的符号, 是把这些符号和对应的地址保存起来,在内核运行的过程中,可以找到这些符号对应的地址。

而模块在加载过程中,其本质就是能动态连接到内核,如果在模块中引用了内核或其它模块的符号,就要EXPORT_SYMBOL这些符号,这样才能找到对应的地址连接。

使用方法:

第一、在模块函数定义之后使用EXPORT_SYMBOL(函数名)
   第二、在掉用该函数的模块中使用extern对之声明
   第三、首先加载定义该函数的模块,再加载调用该函数的模块

另外,在编译调用某导出函数的模块时,往往会有WARNING: "****" [**********] undefined!
使用dmesg命令后会看到相同的信息。开始我以为只要有这个错误就不能加载模块,后来上网查了一下,发现这主要是因为在编译连接的时候还没有和内核打交道,当然找不到symbol了,但是由于你生成的是一个内核模块,所以LD不提示error,而是给出一个warning,寄希望于在insmod的时候,内核能够把这个symbol连接上。

一个模块mod1中定义一个函数func1;在另外一个模块mod2中定义一个函数func2,func2调用func1。
在模块mod1中,EXPORT_SYMBOL(func1);
在模块mod2中,extern int func1();
就可以在mod2中调用func1了

EXPORT_SYMBOL示范

比如有两个驱动模块:Module A和Module B,其中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,say hello world!\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>
extern int functl(void);
static int func2(void)
{  func1();  printk("In Func: %s...\n",__func__);  return 0;
}  static int __init hello_init(void)
{  printk("Module 2,is used Module 1 function!\n");  func2();  return 0;
}  static void __exit hello_exit(void)
{  printk("Module 2,Exit!\n");
}  module_init(hello_init);
module_exit(hello_exit);  

在驱动加载的时候,一定要先加载定义function1的Module A模块,然后再加载调用function1的Module B的驱动模块。
如下操作:
insmod Module_A.ko
insmod Module_B.ko  

转载于:https://www.cnblogs.com/Caden-liu8888/p/7725293.html

EXPORT_SYMBOL使用相关推荐

  1. EXPORT_SYMBOL的作用是什么

    http://www.cnblogs.com/riskyer/p/3221805.html EXPORT_SYMBOL只出现在2.6内核中,在2.4内核默认的非static 函数和变量都会自动 导入到 ...

  2. Linux驱动编程中EXPORT_SYMBOL()介绍

    一.查看内核驱动代码你会发现很多的函数带有EXPORT_SYMBOL()宏定义. 二.那么EXPORT_SYMBOL的作用是什么?            EXPORT_SYMBOL标签内定义的函数或者 ...

  3. linux export_symbol 变量,linux EXPORT_SYMBOL

    From http://blog.csdn.net/brucexu1978/article/details/7081748 2011-12-18 16:05 1480人阅读 评论(0) System. ...

  4. export_symbol的使用

    在内核模块中使用tasklist_lock来操作保护内核进程链表,由于tasklist_lock如果要在模块中使用就必须把它填充到内核符号表里面,就要使用export_symbol,tasklist_ ...

  5. linux symbol文件,LINUX EXPORT_SYMBOL_GPL及EXPORT_SYMBOL导出函数

    EXPORT_SYMBOL(),这个宏也是将函数导出让所有模块都可以使用,而EXPORT_SYMBOL_GPL()这个宏主要是给有GPL认证的模块使用. 2).EXPORT_SYMBOL标签内定义的函 ...

  6. driver: linux2.6 内核模块导出函数实例(EXPORT_SYMBOL)

    内核版本:2.6.38-11-generic 内核自己都大量利用内核符号表导出函数,那么应该导出呢,ldd3上面说只需要EXPORT_SYMBOL一类的宏导出即可,结果试了很久都不行,最后查看文档,算 ...

  7. 宏EXPORT_SYMBOL在内核中的作用

    Module运行在kernel space,不能直接调用应用程序库,只能调用内核函数. EXPORT_SYMBOL的作用是把内核函数的符号导出,也就是将函数的入口地址导出. Module在运行的时候会 ...

  8. 谈EXPORT_SYMBOL使用

    [转载]谈EXPORT_SYMBOL使用 转自:http://www.cnblogs.com/GT_Andy/archive/2011/06/23/2088127.html EXPORT_SYMBOL ...

  9. 关于EXPORT_SYMBOL

    linux2.6的"/prob/kallsyms"文件对应着内核符号表,记录了符号以及符号所在的内存地址. 模块可以使用如下宏导出符号到内核符号表: [c-sharp] view ...

最新文章

  1. QoS policy-map class-map
  2. C#操作XML小结_转载
  3. 使用shouldComponentUpdate进行性能优化
  4. 关于网络编程的一些问题
  5. 数据结构 | B树、B+树、B*树
  6. 解决:springcloud eureka 注册的服务config-client 状态Status:UNKNOWN (1)
  7. springMVC rest风格
  8. python 下载文件-Python实现HTTP协议下的文件下载方法总结
  9. 跨进程API Hook
  10. 不格式化U盘的情况下部署WinPE
  11. python图片转文字easyocr_EasyScreenOCR - 图片文字识别工具
  12. 携手业内专家赋能AI时代--EpiK铭识协议发起开源知识运动
  13. filebeat报错:Harvester could not be started on exist file
  14. cadence软件打开报错“计算机中丢失cdsCommon.dll”的解决办法
  15. 5.5.JMeter中调度器起作用(需要循环次数设置成永远)
  16. 米狗族 Android平台Qt开发入门教程
  17. 力扣347:前k个高频元素---leetcode347:Top K Frequent Elements
  18. python小猴子摘桃子的故事_小猴子摘桃子
  19. [转载]一些MSN签名
  20. Pocscan搭建详解

热门文章

  1. 基2FFT算法matlab程序编写,频率抽取(DIF)基2FFT算法的MATLAB实现
  2. python 获取文件名_真实需求 | Python+os+openpyxl 批量获取Excel的文件名和最大行数...
  3. 【OpenGL从入门到精通(三)】第一个点的理论
  4. matlab 图像 幅度谱 低通滤波_数字图像处理期末复习2018-12-21
  5. 牛客网数据开发题库_数据库刷题—牛客网(21-30)
  6. Python 列表list与数组array的区别
  7. 机器学习相关知识 大佬博客整理
  8. 光纤收发器和协议转换器之间有哪些区别?
  9. 光端机与光纤收发器的应用
  10. HDMI光端机是什么?hdmi光端机产品参数及性能特点介绍