在查看内核驱动代码的时候会经常看到在一些函数后面总会跟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加载时也会出错。

[cpp] view plain copy
  1. // Module A (mod_a.c)
  2. #include<linux/init.h>
  3. #include<linux/module.h>
  4. #include<linux/kernel.h>
  5. static int func1(void)
  6. {
  7. printk("In Func: %s...\n",__func__);
  8. return 0;
  9. }
  10. // Export symbol func1
  11. EXPORT_SYMBOL(func1);
  12. static int __init hello_init(void)
  13. {
  14. printk("Module 1,Init!\n");
  15. return 0;
  16. }
  17. static void __exit hello_exit(void)
  18. {
  19. printk("Module 1,Exit!\n");
  20. }
  21. module_init(hello_init);
  22. module_exit(hello_exit);
[cpp] view plain copy
  1. // Module B (mod_b.c)
  2. #include<linux/init.h>
  3. #include<linux/kernel.h>
  4. #include<linux/module.h>
  5. static int func2(void)
  6. {
  7. extern int func1(void);
  8. func1();
  9. printk("In Func: %s...\n",__func__);
  10. return 0;
  11. }
  12. static int __init hello_init(void)
  13. {
  14. printk("Module 2,Init!\n");
  15. func2();
  16. return 0;
  17. }
  18. static void __exit hello_exit(void)
  19. {
  20. printk("Module 2,Exit!\n");
  21. }
  22. module_init(hello_init);
  23. module_exit(hello_exit);

EXPORT_SYMBOL的作用浅析相关推荐

  1. EXPORT_SYMBOL的作用是什么

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

  2. C++中双冒号::的作用浅析

    转载自:https://www.jb51.net/article/142032.htm C++中双冒号::的作用浅析 更新时间:2018年06月14日 11:59:12   作者:yz930618 在 ...

  3. C语言中typeof作用,浅析C语言中typeof关键字用法

    浅析C语言中typeof关键字用法 前言 C语言中 typeof 关键字是用来定义变量数据类型的.在linux内核源代码中广泛使用. 下面是Linux内核源代码中一个关于typeof实例: #defi ...

  4. oracle pga的作用,浅析Oracle中PGA和UGA两者间的区别

    初学Oracle时,你可能会对Oracle中PGA和UGA两者间的区别产生疑问,这里就PGA和UGA两者间的区别发表下个人意见,在这里拿出来和大家分享一下. The Process Memory除SG ...

  5. 【转】linux/unix下 pid文件作用浅析

    2019独角兽企业重金招聘Python工程师标准>>> 转自http://siwind.iteye.com/blog/1753517 在linux系统的目录/var/run下面一般我 ...

  6. oracle进程的作用,浅析Oracle10g新进程 MMON 和 MMNL的作用

    在Oracle10g中,有两个后台进程是新增的,这里我想说的是MMON和MMNL. 在Oracle不同的文档中,对这两个进程的解释存在歧义. MMON 应该是 Memory Monitor 的缩写,但 ...

  7. fflush函数作用浅析

    一.fflush函数:更新缓存区 头文件:#include <stdio.h> 函数定义:int fflush(FILE *stream); 函数说明:fflush()会强迫将缓冲区内的数 ...

  8. PHP在泥浆中作用,浅析PHP膨润土泥浆在钻孔灌注桩的实际应用

    科技信息 2012 年 第 7 期SCIENCE & TECHNOLOGY INFORMATION 0 引言 钻孔灌注桩基础是将桥梁巨大的上部荷载传递给地基岩土体,因此而言承载力是控制工程安全 ...

  9. 宏EXPORT_SYMBOL在内核中的作用

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

最新文章

  1. 恶犬秒变萌汪:东京大学开源“治愈系”GAN图片拼贴工具 | 技术头条
  2. 来客推商城V3多用户uni-app商城源码如何搭建?盈利模式怎么样的?
  3. Struts2-EL表达式为什么能获取值栈数据
  4. pythonopencv的配置_python配置与使用OpenCV
  5. 《现在的泪,都是当年脑子进的水》读书笔记
  6. 【Xcode】编辑与调试
  7. 求400以内的亲密对数c语言,东南大学C++编程练习
  8. capture 部分元器件编号_Capture新建元件符号文件
  9. 英特尔傲腾技术:部署更简单,内存提升游戏性能
  10. 4. 嵌入式OpenWRT入门基础篇-----设置OpenWRT系统为AP、中继模式
  11. 综合微软、AMiner两大学术图谱,清华大学唐杰博士如何将Open Academic Graph亿级数据精准匹配
  12. python dict.get 用法
  13. 金蝶K3案例教程存货核算后台配置
  14. 山东省计算机科学与技术排名,2016山东省大学各学科门类最佳专业排行榜|大学排行榜|最佳专业排行榜_新浪教育_新浪网...
  15. 期货开户趋势的本质是惯性
  16. 根据年份判断属相php,自动算出生肖属相的c程序编写程序,输入一个年份,判断该年属相.(提示switch-case......
  17. 照片后期制作计算机配置,追求色彩真实还原,图片后期处理电脑配置推荐
  18. 2023年英语二大作文押题猜想(达立易考)
  19. (心态篇)空杯心态,一个程序员的自我修炼
  20. Redis修行 — 基数统计:HyperLogLog

热门文章

  1. 联动加入redmine的wik
  2. matlab 波形文件4438c,matlab 5 计算分析
  3. 免费截图标注贴图工具:Snipaste
  4. 信息推送服务使用规则
  5. 天津大学:抑制激光增材制造镍基高温合金热裂纹的新合金设计方法
  6. 声网微信小程序一对一语音通话
  7. 浙大远程护理计算机作业答案,2016浙大远程计算机基础应用作业2
  8. 【小毛驴的絮叨】时间你慢慢走,我想欣赏一下沿途的风景(2020年11月)
  9. 用Tripwire实现系统完整性检查
  10. 20个优质Python学习资源