Chinaunix首页 | 论坛 | 博客
  • 博客访问: 168377
  • 博文数量: 43
  • 博客积分: 95
  • 博客等级: 民兵
  • 技术积分: 215
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-24 17:23
文章分类

全部博文(43)

文章存档

2016年(1)

2015年(5)

2014年(10)

2013年(24)

2012年(3)

我的朋友

分类: LINUX

2013-06-07 15:22:20

转自:http://blog.csdn.net/cailiwei712/article/details/7998525
在查看内核驱动代码的时候会经常看到在一些函数后面总会跟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加载时也会出错。

  1. //ModuleA(mod_a.c)
  2. #include
  3. #include
  4. #include
  5. staticintfunc1(void)
  6. {
  7. print
阅读(1515) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~