Raspberry Pi ARM Float ABI Compatibility

Raspberry Pi ARM Float ABI Compatibility

本文关键字:ABI Compatibility Float ARM Pi Raspberry      更新时间:2023-10-16

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

如果我使用"arm-linux-gnueabi"工具链(不指定任何 ARM 标志(构建我的应用程序,那么我的应用程序将使用软浮动 ABI。正确?

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

如果我的应用程序使用软浮子 ABI,那么我的应用程序肯定链接到软浮点 ABI 共享标准库。当我在树莓派上运行我的应用程序时,一切都按预期工作。如果 Raspbian 使用硬浮点 ABI(我猜共享标准库也这样做(,这怎么可能?

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

--with-float=soft
--with-arch=armv5

我正在像这样编译我的应用程序:

arm-linux-gnueabi-g++ test.cpp -o test

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

double test = (123.456 + 789.123) * 1.23;
printf("%fn", test); // prints: 1122.472170
printf("%fn", std::floor(test)); // prints: 1122.000000

你所有的肯定都是正确的,我只是想对 Raspbian 的armhf添加一点精度。

Debian 的armhf(arm-linux-gnueabihf(针对的是 ARMv7t 硬浮点。由于 Raspbian 是基于 Debian 的,你会期望相同,但 Raspbian armhf的目标是 ARMv6 硬浮点(这也是 Raspbian 存在的原因:在 Debian 的armel ARMv4t 软浮点和armhf架构之间找到一个中间地带,以正确利用 Raspberry 的 CPU(。

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

当我在树莓派上运行我的应用程序时,一切都按预期工作。如果 Raspbian 使用硬浮点 ABI(我猜共享标准库也这样做(,这怎么可能?

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

如果你从来没有在你的测试程序中使用浮点 ABI(我的意思是你不会通过 CPU/FPU 寄存器将浮点数传递给外部库 - 但是你可以完美地在内部进行浮点计算 - 使用软浮点 - 例如,在第三方库中实际"使用"结果之前将结果转换为int(, 那么你永远不会达到 ABI 差异并且一切正常。

关于你给出的使用浮点的例子,我相信它们属于我刚才描述的类别:你从不使用硬浮点 ABI。

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

无论如何,您应该避开当前的arm-linux-gnueabi工具链,并使用专门为Raspbian设计的工具链。只需在网络上搜索">Raspberry Pi交叉编译器"。这样你就不会被打扰了。