免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 14520 | 回复: 1
打印 上一主题 下一主题

编译模块出现的"__aeabi_uldivmod"的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-03-09 11:21 |只看该作者 |倒序浏览
我写的nftl模块,总共有两个文件nftlcore.c nftlmount.c,单独编译没有
问题(我的编译器版本arm-linux-gcc(4.3.2)),能生成nftl.ko,但是在NFS下
加载模块的时候却出现了如下问题:(开发板是mini2440)

/kernel_modules/nftl/nftl02 $ ls
Makefile        nftl.ko         nftl.o          nftlmount.c
Module.symvers  nftl.mod.c      nftlcore.c      nftlmount.o
modules.order   nftl.mod.o      nftlcore.o
/kernel_modules/nftl/nftl02 $ insmod nftl.ko
nftl: Unknown symbol __aeabi_uldivmod
insmod: cannot insert `nftl.ko': Unknown symbol in module (-1): No such file or directory

我在网上查了一下,有人说是由于arm-2008q3的Gcc 4.3版,进行了代码优化导致,
也不知道到底是不是,该如何解决这个问题?希望各位大虾指教,小弟不胜感激。

论坛徽章:
0
2 [报告]
发表于 2010-03-11 11:34 |只看该作者
哈哈,我终于解决了.
说实话,遇到这个问题好几天了,也在网上看了些解决方案:
有的说是由于arm-2008q3的Gcc 4.3版,进行了代码优化导致,
也有人直接给出了patch,http://patchwork.openembedded.org/patch/1003/
前期,对这些方法我都逐个的试过了(虽然不是太懂那些大虾在说什么,嘿嘿),
最终都没有解决,心情很是沮丧.....
但问题总是要解决的,我就采取了最笨的方法,逐个函数分析,终于让我给找到
问题的原因了:
在static void nftl_add_mtd(struct mtd_blktrans_ops *tr, struct mtd_info *mtd)中
有这么一句:nftl->nb_blocks = mtd->size / mtd->erasesize;
初看也没什么,可是一看他们的定义就发现问题了。
mtd->size的类型是uint64_t
mtd->erasesize的类型是uint32_t
问题就出现在这里,只需要将上面的那句话改成
nftl->nb_blocks = ((uint32_t)mtd->size) / mtd->erasesize;就OK了,哈哈,其实也
就是加了一个强制类型转换而已。
问题:不明白为什么不同类型的数据用除法就不行?到底是什么原因?如果非要用,又
      又不想像我这样的用强制类型转换,改如何做?
总结:遇到问题,要沉着,不要急躁,试着静下心来,试着运用一些方法,许多问题自
   然会水落石出。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP