【求助】内核中使用EXPORT_SYMBOL,编译时调用模块提示undefined,请高手帮忙

mayo 2011-11-28 05:07:05
在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的函数,不知道是什么原因:(
...全文
4007 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunling83417 2012-01-09
  • 打赏
  • 举报
回复
我就是自己的两个模块,B模块会调A模块的函数,加了KBUILD_EXTRA_SYMBOLS,路径肯定对,渴还是会出警告。。。
mayo 2011-12-28
  • 打赏
  • 举报
回复 1
此问题终于有答案了,应该是Kconfig和Makefile配合的问题。
解决办法:
1.比如在test目录在Kconfig中定义对应的config,如config TEST_ABC
2.然后在test目录的上层Makefile中要定义obj-$(CONFIG_TEST_ABC)+=test/
3.test目录Makefile中定义obj-$(CONFIG_TEST_ABC)+=abc.o
这样abc.c文件中定义的EXPORT函数才能被正确的导出。

感谢各位的支持~~
mayo 2011-12-28
  • 打赏
  • 举报
回复
此问题终于有答案了,应该是Kconfig和Makefile配合的问题。
解决办法:
1.比如在test目录在Kconfig中定义对应的config,如config TEST_ABC
2.然后在test目录的上层Makefile中要定义obj-$(CONFIG_TEST_ABC)+=test/
3.test目录Makefile中定义obj-$(CONFIG_TEST_ABC)+=abc.o
这样abc.c文件中定义的EXPORT函数才能被正确的导出。

感谢各位的支持~~
mayo 2011-12-20
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 yjpcn 的回复:]
是不是abc模块的所有函数都没用在Module.sysvers里,如果是这样,就是你Makefile文件修改的不对。
[/Quote]
是这样的,哪个地方不对啊?
如下添加方式不行吗?谢谢
在kernel里面usb目录下的Makefile里面添加编译如下:
obj-y += module_a.o
obj-m += module_b.o

yjpcn 2011-12-20
  • 打赏
  • 举报
回复
是不是abc模块的所有函数都没用在Module.sysvers里,如果是这样,就是你Makefile文件修改的不对。
deep_pro 2011-12-17
  • 打赏
  • 举报
回复
试试在xyz里extern 一下要调用的函数
内核里找个地方也extern一下

abc里static不能加的
mayo 2011-12-17
  • 打赏
  • 举报
回复
最近忙别的事情一直没有关注此问题,今天又看了一下,如下:
参考CU帖子:http://bbs.chinaunix.net/thread-1919530-1-1.html
做了尝试,还是如此问题:
在kernel里面usb目录下的Makefile里面添加编译如下:
obj-y += module_a.o
obj-m += module_b.o

编译的时候mod_a.o和mod_b.o都生成了,链接时提示如下,然后就退出编译了
CC drivers/usb/serial/module_a.o
LD drivers/usb/serial/built-in.o
CC [M] drivers/usb/serial/module_b.o

WARNING: "func1" [drivers/usb/serial/module_b.ko] undefined!
make[2]: *** [__modpost] Error 1
make[1]: *** [modules] Error 2

另外,不管函数是否添加static关键字都一样
mayo 2011-12-17
  • 打赏
  • 举报
回复
刚刚往kernel目录下的Module.sysvers添加一行,还是不行
kernel编译的时候会重新生成Module.sysvers,添加的内容就没有了,编译还是通不过

现在看来要找到为什么生成的Module.sysvers中没有这几个函数了。
不知道有没有人了解此文件的生成规则?
mayo 2011-12-17
  • 打赏
  • 举报
回复
extern添加了,static也去掉了,都不行啊

kernel目录下的Module.sysvers没有对应的函数,这个可以手工添加吗?
就是不知道什么原因没有生成这个?能找到这个原因最好
falloutmx 2011-12-17
  • 打赏
  • 举报
回复
出现undefined肯定是Module.sysvers没有对应函数。重点从这里开始查吧,你也可以把单独编译生成的Module.sysvers添加到系统的Module.sysvers里
Wenxy1 2011-11-30
  • 打赏
  • 举报
回复
错误信息不完整,贴上完整的编译信息!
用EXPORT_SYMBOL_GPL()或者EXPORT_SYMBOL()宏导出对应的函数,另外函数不要用static 关键字。
mayo 2011-11-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ele01 的回复:]
这个貌似只是WARNING,error应该不是这个
[/Quote]
那是怎么回事啊?用putty存下所有的编译过程,前面没有别的error,而且对应的.o文件都已经生成了,最后kernel在make modules的时候报错停止了。
ele01 2011-11-29
  • 打赏
  • 举报
回复
这个貌似只是WARNING,error应该不是这个
mayo 2011-11-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 passport01 的回复:]
两个有依赖关系的模块,发生这种问题可以用下面方法解决。
方法一: 把abc模块都放在Linux源码目录啊下,与源码一起编译,不管是直接编译到内核,还是被编译成模块.
方法二: 与内核源码分开放置,但需要手动(使用命令),更新依赖表. 其实在方法一中,依赖表被脚本自动更新了。
[/Quote]
多谢回复~~
我们这个是嵌入式系统,这两个模块代码都是在Linux内核源码USB驱动目录下的,修改的也是USB相关的KConfig和Makefile。
而且如果这两个同时编译成模块或者编译到内核,都是没有问题的。
还有别的思路吗?不知道问题出在哪里。
passport01 2011-11-28
  • 打赏
  • 举报
回复
两个有依赖关系的模块,发生这种问题可以用下面方法解决。
方法一: 把abc模块都放在Linux源码目录啊下,与源码一起编译,不管是直接编译到内核,还是被编译成模块.
方法二: 与内核源码分开放置,但需要手动(使用命令),更新依赖表. 其实在方法一中,依赖表被脚本自动更新了。

4,465

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧