谈EXPORT_SYMBOL使用
来源:互联网 发布:java接口怎么用 编辑:程序博客网 时间:2024/06/06 12:20
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这些符号,这样才能找到对应的地址连接。
2、使用方法
第一、在模块函数定义之后使用EXPORT_SYMBOL(函数名)
第二、在掉用该函数的模块中使用extern对之声明
第三、首先加载定义该函数的模块,再加载调用该函数的模块
另外,在编译调用某导出函数的模块时,往往会有WARNING: "****" [**********] undefined!
使用dmesg命令后会看到相同的信息。开始我以为只要有这个错误就不能加载模块,后来上网查了一下,发现这主要是因为在编译连接的时候还没有和内核打交道,当然找不到symbol了,但是由于你生成的是一个内核模块,所以LD不提示error,而是给出一个warning,寄希望于在insmod的时候,内核能够把这个symbol连接上。
参考资料:
http://blog.chinaunix.net/u/12592/showart_461504.html
一个模块mod1中定义一个函数func1;在另外一个模块mod2中定义一个函数func2,func2调用func1。
在模块mod1中,EXPORT_SYMBOL(func1);
在模块mod2中,extern int func1();
就可以在mod2中调用func1了。
- 谈EXPORT_SYMBOL使用
- 谈EXPORT_SYMBOL使用
- 谈EXPORT_SYMBOL使用
- 谈EXPORT_SYMBOL使用
- 谈EXPORT_SYMBOL使用
- 谈EXPORT_SYMBOL使用
- 谈EXPORT_SYMBOL使用
- 谈EXPORT_SYMBOL使用
- 谈EXPORT_SYMBOL使用
- 谈EXPORT_SYMBOL使用
- 谈EXPORT_SYMBOL使用
- 谈EXPORT_SYMBOL使用(转载)
- export_symbol的使用
- export_symbol的使用
- Kernel-----EXPORT_SYMBOL使用
- EXPORT_SYMBOL的使用
- EXPORT_SYMBOL的使用
- linux中EXPORT_SYMBOL使用
- hibernate4.2.4之环境搭建与测试实例
- UIImageView添加圆角图片
- Android端用户登录
- 08-01 接口 异常 文件IO流
- 我的Android笔记(八)—— 使用Jsoup解析Html
- 谈EXPORT_SYMBOL使用
- 理解IP地址和端口号
- 不同年龄的表白
- redhat yum破解方法
- MediaMetadataRetriever的用法
- mac下使用APKtool,dex2jar,jd-gui反编译APK
- 08-02 文件IO流 网络通信(TCP) 集合 泛型
- 数据结构之满二叉树和完全二叉树的区别
- Merge Two Sorted Lists