Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2757761
  • 博文数量: 102
  • 博客积分: 1444
  • 博客等级: 中尉
  • 技术积分: 13891
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-29 10:58
文章分类

全部博文(102)

文章存档

2014年(29)

2013年(14)

2012年(59)

分类: LINUX

2012-07-21 21:59:03

自己写裸机驱动程序时,使用了除法,在链接的时候出了如下错误:
 
 
使用的编译器是:
 
 
后来上网搜了一下原因,由于编译器不支持除法运算,但是也没有搜到解决方案。看了一下代码确实用到了除法,把除法去掉可以正常连接通过。后来想了想了,之前编译内核和编译u_boot都是这个编译器的呀,他们肯定有除法运算呀,他们是怎么做到的呢?
于是看了一下u_boot的Makefile,很晕,东西很多,后来编译了一下,看到了这个:
 
 
u_boot在链接的时候,指定了黄色颜色的路径和-lgcc选项(-l后面的是链接库的名字)

到指定的目录下看到如下内容:
 
 
里面有一个libgcc.a的静态库,编译器支持软浮点,猜想软浮点的实现应该就是在找个静态库中。
在自己的Makefile里面加上了这些东西,继续编译连接出现如下错误信息:
 
 
缺少"raise符号",在u_boot源码中搜索"raise"如下:
 

是一个函数,什么也没干,我在自己的代码中写了一个这样的空函数,编译通过。

Makefile 如下:
 
 
 
总结:
    ARMv4t的ARM核不支持浮点运算,为了让其支持浮点运算,编译器使用了软浮点的方法,但是需要相应的除法库支持,在连接的时候需要指定其路径和库名。

    一句经典名言: 在IT行业,遇到问题,只要一直解决,总有解决的一天。
阅读(44558) | 评论(4) | 转发(4) |
给主人留下些什么吧!~~

kangear2013-04-12 10:44:38

学习发不少知识,太感谢了。

blacksapper2012-08-15 15:49:21

写的好长.我之前也遇到了这个问题.说白了指定一下链接库位置就行了.
/usr/lib什么的.

草根老师2012-07-23 18:18:16

呵呵,加油!

jinandytao2012-07-23 17:32:01

老师写的真详细,受教了。
我也是今天刚知道,有些核带浮点运算硬件电路,有些核不带,使用软件模拟的浮点运算,可不知有何具体区别?
今天看了老师的博客,学习了不少。