no symbol version for xxx

最近在加载驱动时遇到这个问题,在网上搜了下,故转载下:http://blog.csdn.net/hshl1214/article/details/8769112


前几天一个同事问我:如果一个模块要调用另一个模块的函数,要不要做什么特别的处理?我当时只是知道需要将被调用的函数EXPORT_SYMBOL();。但是由于具体的模块实验自己还没有做过,我就立马做了一个给他看,自己也验证一下。这实验一做,问题就来了:虽然在编译通过了(有警告:

  1. WARNING: "exported_function_2" [/home/tekkaman/development/research/Linux_module/caller/caller.ko]undefined!
),但是当把导出函数的模块挂载后,再挂载调用模块的时候出了错误无法挂载:
  1. # insmod exporter_1.ko
  2. Hello, Tekkaman Ninja !
  3. exported_function_1 is online!
  4. # insmod exporter_2.ko
  5. Hello, Tekkaman Ninja !
  6. exported_function_2 is online!
  7. # insmod caller.ko
  8. caller: no symbol version for exported_function_2
  9. caller: Unknown symbol exported_function_2 (err -22)
  10. caller: no symbol version for exported_function_1
  11. caller: Unknown symbol exported_function_1 (err -22)
  12. insmod: error inserting 'caller.ko': -1 Invalid parameters
    这里先将我的测试用例分享如下,大家可以先看下代码:

   (请自行修改内核源码目录和交叉编译器的定义)
   
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
在出了问题之后,我到网上google了解决方法

   其中15楼daidaiangel 的解决办法是正解,转载如下:
  1. 这是linux kernel 2.6.26 之后版本的bug (详细描述, 请看http://bugzilla.kernel.org/show_bug.cgi%3Fid%3D12446)
  2. 并且这个bug不会被fix

  3. 解决办法是把mod_a的Module.symvers放到mod_b的当前路径,从而编译mod_b,符号信息会自动连接进去.
  4. 或者在mod_b的makefile中使用KBUILD_EXTRA_SYMBOLS指定mod_a的Module.symvers, 如:
  5. KBUILD_EXTRA_SYMBOLS=/mod_a/Module.symvers

  6. 编译mod_b时,搜索Module.symvers的路径是:
  7. 1, kernel source path, e.g. /usr/src/kernels/linux-2.6.28.10
  8. 2, makefile中M=所指定的路径, 它等效于变量KBUILD_EXTMOD的值
  9. 3, 变量KBUILD_EXTRA_SYMBOLS的值
    而16楼 littertiger  道出了问题的本质:
  1. 15楼分析透彻
  2. 简单说来,就是小b生成的时候不知道小a symbol的校验码,小b加载的时候自然check 校验码出错
    同时还有一篇网文作为参考,解决方法相同: Linux内核模块加载报错”no symbol version for struct_module”解决办法

    用这个方法的确可以解决问题,只要将上面的测试程序中的caller的makefile中加上“KBUILD_EXTRA_SYMBOLS”就好了(里面已经有了,去掉注释,路径改下,但必须是绝对路径哦!)。重新编译caller模块即可。

实验过程:

  1. root@dm816x-evm:/# insmod exporter_1.ko
  2. Hello, Tekkaman Ninja !
  3. exported_function_1 is online!
  4. root@dm816x-evm:/# insmod exporter_2.ko
  5. Hello, Tekkaman Ninja !
  6. exported_function_2 is online!
  7. root@dm816x-evm:/# insmod caller.ko
  8. Hello, Tekkaman Ninja !
  9. Now call exporters's function!
  10. I'm exported_function_1 !(in /home/tekkaman/development/research/Linux_module/exporter_1/exporter_1.c)
  11. I'm exported_function_2 !(in /home/tekkaman/development/research/Linux_module/exporter_2/exporter_2.c)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值