c++ - Raspberry Pi ARM Float ABI 兼容性

标签 c++ gcc g++ arm raspberry-pi

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

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

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

如果我的应用程序使用软浮点 ABI,那么我的应用程序肯定链接到软浮点 ABI 共享标准库。当我在我的 Raspberry Pi 上运行我的应用程序时,一切都按预期工作。如果 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("%f\n", test); // prints: 1122.472170
printf("%f\n", std::floor(test)); // prints: 1122.000000

最佳答案

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

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

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

When I run my application on my Raspberry Pi everything works as expected. How can this be, if Raspbian uses hard float ABI (and I'm guessing the shared standard library also does)?

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

如果您从未在测试程序中使用浮点 ABI(我的意思是您不通过 CPU/FPU 寄存器将 float 传递给外部库——但是您可以在内部完美地进行浮点计算—— - 使用 soft-float——例如在第三方库中实际“使用”它之前将结果转换为 int),那么你永远不会遇到 ABI 差异并且所有工作。

关于您给出的使用 float 的示例,我相信它们属于我刚才描述的类别:您从不使用 hard-float ABI。

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

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

关于c++ - Raspberry Pi ARM Float ABI 兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19180351/

相关文章:

c++ - typeid() 在 g++ 中返回额外的字符

c++ - 链接的可执行文件中缺少静态库中的符号

c++ - 从 C++ 库通知 Objective C

c++ - 无法计算正确的十进制数字

c++ - (缺少)使用 C++11 move 语义的性能改进

gcc - regdef.h : No such file or directory how can I includ files requerd by gcc?

c++ - 链接上 undefined symbol ___gxx_personality_v0

c++ - 为什么我运行 node-waf build 后有一个 .lock-wscript 文件

c++ - 什么时候应该对流使用 fail 函数?

c++ - 在c++中的macOS Catalina上编译 header 和cpp文件的问题