时间:2010-07-23 19:00:48

标签: c linux floating-point arm libc

5 个答案:

答案 0 :(得分:92)

答案 1 :(得分:30)

答案 2 :(得分:19)

严格地说,所有这些答案对我来说都是错误的。

  

当我用我的交叉工具链编译C代码时,链接器打印警告页面,说我的可执行文件使用硬浮动,但我的libc使用软浮动。有什么区别?

Debian VFP wiki包含有关-mfloat-abi

的三种选择的信息
  • soft - 这是纯软件
  • softfp - 这支持硬件FPU,但 ABI 是软兼容的。
  • hard - ABI使用 float VFP 寄存器。

链接器(加载器)错误是因为您有一个共享库,它将在整数寄存器中传递浮点值。您仍然可以使用-mfpu=vfp等编译代码,但是您应该使用-mfloat-abi=softfp,这样如果 libc 需要一个浮点数,它就会以库理解的方式传递。< / p>

Linux内核可以支持VFP指令的仿真。显然,对于这种情况,最好使用-mfpu=none进行编译,并让编译直接生成代码,而不是依赖于任何Linux内核仿真。但是,我不相信OP的错误实际上与此问题有关。它是独立的,还必须与-mfloat-abi一起处理。

Armv5 shared library with ArmV7 CPU与此相反; libc 很难浮动,但应用程序只是 soft 。它有一些解决问题的方法,但使用正确的选项重新编译总是最简单的。

另一个问题是Linux内核必须支持VFP任务(或存在任何ARM浮点)以保存/恢复上下文切换中的寄存器。

答案 3 :(得分:12)

答案 4 :(得分:7)