当我使用交叉工具链编译C代码时,链接器将显示警告页面,指出我的可执行文件使用硬浮点,而我的libc使用软浮点。有什么不同?
当我使用交叉工具链编译C代码时,链接器将显示警告页面,指出我的可执行文件使用硬浮点,而我的libc使用软浮点。有什么不同?
Answers:
严格来说,所有这些答案对我来说似乎都是错误的。
当我使用交叉工具链编译C代码时,链接器将显示警告页面,指出我的可执行文件使用硬浮点,而我的libc使用软浮点。有什么不同?
Debian VFP Wiki包含有关以下三个选项的信息-mfloat-abi
:
soft
-这是纯软件softfp
-这支持硬件FPU,但是ABI是软兼容的。hard
-ABI使用浮点或VFP寄存器。链接器(加载程序)错误是因为您有一个共享库,该库将在整数寄存器中传递浮点值。您仍然可以使用-mfpu=vfp
,等等来编译代码,但是您应该使用它,-mfloat-abi=softfp
以便如果libc需要浮点数,则它以库理解的方式传递。
Linux内核可以支持VFP指令的仿真。显然,-mfpu=none
在这种情况下,您最好进行编译,并让编译直接生成代码,而不是依赖于任何Linux内核仿真。但是,我不认为OP的错误实际上与此问题有关。它是独立的,还必须与一起处理-mfloat-abi
。
带ArmV7 CPU的Armv5共享库与此相反。在libc中是很难浮动,但应用程序只是软。它有一些方法可以解决该问题,但是使用正确的选项进行重新编译始终是最简单的。
另一个问题是Linux内核必须支持VFP任务(或存在的任何ARM浮点数)才能在上下文切换器上保存/恢复寄存器。