日期:2014-05-16  浏览次数:21941 次

【求助】内核中使用EXPORT_SYMBOL,编译时调用模块提示undefined,请高手帮忙
在kernel添加一个模块abc,这个模块直接编译到内核当中去,在xyz.c中调用此模块EXPORT的函数,编译时提示如下错误,编译停止:
abc.c和xyz.c在同一个目录下,其中abc先编译已经生成.o文件,xyz.c也生成.o文件,但在xyz.c编译成ko时出错

WARNING: "func_abc" [drivers/usb/test/xyz.ko] undefined!
WARNING: "func_xyz" [drivers/usb/test/xyz.ko] undefined!
WARNING: "set_abc" [drivers/usb/test/xyz.ko] undefined!
WARNING: "set_xyz" [drivers/usb/test/xyz.ko] undefined!
make[2]: *** [__modpost] Error 1
make[1]: *** [modules] Error 2
make[1]: Leaving directory `/home/xyz/kernel/2.6.21.5'
make: *** [kernelbuild] Error 2

看了很多材料,说这时候undefined不影响模块加载,但现在编译都不能通过。
请问高手,怎样才能忽略告警,让编译进行下去?
谢谢

另外:
这两个模块如果同时编译到内核或者同时编译成ko,都是可以正常编译完成,且按顺序insmod是没有问题的。
就是当abc编译进内核,让xyz模块编译成ko的时候,编译kernel都不能完成。
在编译出错后查看Module.sysvers文件里面找不到abc模块对应EXPORT_SYMBOL的函数,不知道是什么原因:(

------解决方案--------------------
两个有依赖关系的模块,发生这种问题可以用下面方法解决。
方法一: 把abc模块都放在Linux源码目录啊下,与源码一起编译,不管是直接编译到内核,还是被编译成模块.
方法二: 与内核源码分开放置,但需要手动(使用命令),更新依赖表. 其实在方法一中,依赖表被脚本自动更新了。


------解决方案--------------------
错误信息不完整,贴上完整的编译信息!
用EXPORT_SYMBOL_GPL()或者EXPORT_SYMBOL()宏导出对应的函数,另外函数不要用static 关键字。
------解决方案--------------------
试试在xyz里extern 一下要调用的函数
内核里找个地方也extern一下

abc里static不能加的
------解决方案--------------------
出现undefined肯定是Module.sysvers没有对应函数。重点从这里开始查吧,你也可以把单独编译生成的Module.sysvers添加到系统的Module.sysvers里
------解决方案--------------------
是不是abc模块的所有函数都没用在Module.sysvers里,如果是这样,就是你Makefile文件修改的不对。