免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: yjh777
打印 上一主题 下一主题

请教:内核里EXPORT_SYMBOL 宏是什么作用。 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2005-12-19 10:23 |只看该作者
module的KERNEL的函数调用刚好和用户态编译程序不同。

module不需要也不可能在连接时候resolve all the requested symbols。而是在运行时到KERNEL中去找(由KERNEL中的函数load_module()中的__find_symbol做)。KERNEL中有一个符号表,就是EXPORT_SYMBOL的名字表。如果module 引用了一个KERNEL中的未被EXPORT_SYMBOL的符号,就找不到。模块的加载就不成功。

如果非要这样,可以用写上绝对地址的函数指针来调用未被EXPORT_SYMBOL的函数。





原帖由 albcamus 于 2005-12-16 15:58 发表
晕,回复错地方了,转过来:


是给module用,而不是给用户程序用。
在用户态编译程序,当ld程序最终链接你的hello.o成为a.out时,要resolve all the requested symbols,如果你要链接的库没有导出你需要的所 ...

论坛徽章:
0
12 [报告]
发表于 2005-12-19 10:33 |只看该作者
原帖由 思一克 于 2005-12-19 10:23 发表
module的KERNEL的函数调用刚好和用户态编译程序不同。

module不需要也不可能在连接时候resolve all the requested symbols。而是在运行时到KERNEL中去找(由KERNEL中的函数load_module()中的__find_symbol做) ...



思兄说的对,我的类比不恰当。 用户态编译时解析符号是链接时做的,而module则是加载时做的。

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
13 [报告]
发表于 2005-12-19 10:43 |只看该作者
rpm -ql kernel-devel-2.6.9-22.EL | grep "\.h$" | more
原来kernel-devel包已经包含一些源码目录和.h文件了,明白了。

受教了,谢谢两位大侠,胜读十天书。

[ 本帖最后由 yjh777 于 2005-12-19 10:47 编辑 ]

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
14 [报告]
发表于 2005-12-19 11:38 |只看该作者

关于头文件的问题。

albcamus 兄,又发现新问题了, 以kernel.h为例:

[root@156 2.6.9-22.EL-x86_64]# rpm -qf /usr/include/linux/kernel.h
glibc-kernheaders-2.4-9.1.98.EL
[root@156 2.6.9-22.EL-x86_64]# rpm -qf /usr/src/kernels/2.6.9-22.EL-x86_64/include/linux/kernel.h
kernel-devel-2.6.9-22.EL
[root@156 2.6.9-22.EL-x86_64]#  /* 两个文件并不相同,也不是符号链接 */

照程序看include的kernel.h 应该是/usr/include/linux/kernel.h 它是属于glibc-kernheaders-2.4-9.1.98.EL 包的。

这样的话kernel-devel-2.6.9-22.EL包中的.h文件是怎样被用到的呢?

论坛徽章:
0
15 [报告]
发表于 2005-12-19 12:00 |只看该作者
glibc-kernheaders是给glibc用的。
module只用/lib/modules/`uname -r`/build/include下的

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
16 [报告]
发表于 2005-12-19 12:36 |只看该作者
原帖由 albcamus 于 2005-12-19 12:00 发表
glibc-kernheaders是给glibc用的。
module只用/lib/modules/`uname -r`/build/include下的


噢,那就是说编译的时候必须得手动指定include目录了?

但我还是不知道,kernel-devel包中的 /usr/src/kernels/`name -r`/include
什么情况下用?

我问个没完希望大侠不要烦。

论坛徽章:
0
17 [报告]
发表于 2005-12-19 12:42 |只看该作者
你去参考我那篇精华贴,我不回答这个细节问题了

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
18 [报告]
发表于 2005-12-19 12:52 |只看该作者
原帖由 yjh777 于 2005-12-19 12:36 发表


噢,那就是说编译的时候必须得手动指定include目录了?

但我还是不知道,kernel-devel包中的 /usr/src/kernels/`name -r`/include
什么情况下用?

我问个没完希望大侠不要烦。


2.6内核模块编译的时候 make 指定kernel dir的.
$KERNELDIR=/lib/moduls/`uname -r`/build
$(MAKE ) -C $(KERNELDIR) -M=$(PWD) modules

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
19 [报告]
发表于 2005-12-19 15:45 |只看该作者
原帖由 yjh777 于 2005-12-19 12:36 发表


噢,那就是说编译的时候必须得手动指定include目录了?

但我还是不知道,kernel-devel包中的 /usr/src/kernels/`name -r`/include
什么情况下用?

我问个没完希望大侠不要烦。

谢谢mq,   
精华里没找到关于/usr/src/kernels/`name -r`/include的说明。

我比较了一下,/lib/modules/2.6.9-22.EL/build/include/
/usr/src/kernels/2.6.9-22.EL-x86_64/include/  两个目录,发现是一样的,而且都属于
kernel-devel包。 存了两份可能是为了保险吧
------------------------------------------------------------------------------------------------------
晕了,两个的内核版本不一样。 不好意思!
那么事实的真相就是, 每次重编内核的时候(make module_install后),会把相应的
/usr/src/kernels/2.x.xx/include下面的相应的.h文件拷贝到 相应的/lib/modules/2.x.xx/build/include/下面。
是不是接近真理了?

[ 本帖最后由 yjh777 于 2005-12-19 16:05 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP