Raspberry Pi ARM Float ABI兼容性

pqv*_*vst 4 c++ gcc arm g++ raspberry-pi

我目前正在我的Ubuntu机器上对Raspberry Pi执行一些交叉编译测试.我目前的理解是Raspberry Pi支持硬件浮点,默认的Raspbian OS映像是使用硬件浮点(armhf)构建的.正确?

如果我使用"arm-linux-gnueabi"工具链构建我的应用程序(没有指定任何ARM标志),那么我的应用程序将使用soft float ABI.正确?

在这种情况下,我的所有依赖项也必须使用相同的ABI才能正确链接.正确?

如果我的应用程序使用软浮点ABI,那么我的应用程序肯定链接到一个软浮动ABI共享标准库.当我在Raspberry Pi上运行我的应用程序时,一切都按预期工作.如果Raspbian使用硬浮ABI(我猜共享标准库也有),怎么会这样呢?

仅供参考:我的默认arm-linux-gnueabi配置为:

--with-float=soft
--with-arch=armv5
Run Code Online (Sandbox Code Playgroud)

我正在编译我的应用程序,如下所示:

arm-linux-gnueabi-g++ test.cpp -o test
Run Code Online (Sandbox Code Playgroud)

我的程序确实包括浮点计算:

double test = (123.456 + 789.123) * 1.23;
printf("%f\n", test); // prints: 1122.472170
printf("%f\n", std::floor(test)); // prints: 1122.000000
Run Code Online (Sandbox Code Playgroud)

sya*_*yam 7

你所有的肯定都是正确的,我只想添加一些关于Raspbian的精确度armhf.

Debian armhf(arm-linux-gnueabihf)的目标是ARMv7t hard-float.由于Raspbian基于Debian你会期望相同,但Raspbian的armhf目标是ARMv6硬浮(这是Raspbian存在的首要原因:找到Debian之间的中间地带armel- ARMv4t软浮 -和armhf架构正确利用Raspberry的CPU).

因此Raspbian谈论它有点危险armhf,特别是因为很多人会使用Debian(或Ubuntu等衍生产品)作为主机系统,因此可能会混淆两者.如果你问我,Raspbian的人犯了一个错误,保持相同的架构名称,它应该是arm6hf.

当我在Raspberry Pi上运行我的应用程序时,一切都按预期工作.如果Raspbian使用硬浮ABI(我猜共享标准库也有),怎么会这样呢?

据我所知,arm-linux-gnueabi和之间的唯一区别arm-linux-gnueabihf是涉及浮点的调用约定(前者使用整数寄存器传递它们,后者使用浮点寄存器).

如果您从未在测试程序中使用浮点ABI(我的意思是您不通过CPU/FPU寄存器将浮点数传递给外部库 - 但是您可以在内部完美地进行浮点计算 - 使用软件-float - 例如int,在第三方库中实际"使用"之前将结果投射到,然后你从未达到ABI差异并且一切正常.

关于你使用浮点数的例子,我认为它们属于我刚才描述的类别:你从不使用硬浮动ABI.

  • 很可能std::floor是内联的(确保这一点的最好方法是查看程序集转储).
  • printf使用可变参数,所以你实际上使用传统的C调用约定,即.参数在堆栈上传递,而不是通过CPU/FPU寄存器传递.

无论如何,你应该从你当前的arm-linux-gnueabi工具链中清除,并使用专为Raspbian设计的工具链.只需在网络上搜索" Raspberry Pi交叉编译器 "即可.这样你就不会受到打扰.