Raspberry Pi ARM Float ABI Compatibility
Raspberry Pi ARM Float ABI Compatibility
我目前正在我的 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-gnueabi
和arm-linux-gnueabihf
之间的唯一区别是涉及浮点的调用约定(前者使用整数寄存器传递它们,后者使用浮点寄存器传递它们(。
如果你从来没有在你的测试程序中使用浮点 ABI(我的意思是你不会通过 CPU/FPU 寄存器将浮点数传递给外部库 - 但是你可以完美地在内部进行浮点计算 - 使用软浮点 - 例如,在第三方库中实际"使用"结果之前将结果转换为int
(, 那么你永远不会达到 ABI 差异并且一切正常。
关于你给出的使用浮点的例子,我相信它们属于我刚才描述的类别:你从不使用硬浮点 ABI。
std::floor
很可能是内联的(确保这一点的最佳方法是查看程序集转储(。-
printf
使用可变参数,因此您实际上使用的是传统的 C 调用约定,即参数在堆栈上传递,而不是通过 CPU/FPU 寄存器传递。
无论如何,您应该避开当前的arm-linux-gnueabi
工具链,并使用专门为Raspbian设计的工具链。只需在网络上搜索">Raspberry Pi交叉编译器"。这样你就不会被打扰了。
- 海湾合作委员会手册中提到的"C++ ABI Specification"是什么?
- 链接器错误:未定义对"Reference_Genome::seq[abi:cxx11]"的引用
- 尝试从头开始实现Leetcode的FizzBuzz多线程问题。收到"libc++abi.dylib: terminating"错误
- 在AAPCS(ARM ABI)下,C/C++结构填充的稳定性如何
- 对于哪些 ABI,我可以使用 NDK v10e 构建 apk?
- C++ ABI 兼容性问题/张量流
- 了解 ELF 可执行SHT_NOTE部分".note.ABI-tag"
- 为什么库API+编译器ABI足以确保具有不同版本gcc的对象之间的兼容性
- E/libc++abi:终止于类型为google::protobuf::FatalException的未捕获异常
- libc++abi未定义符号:_ZTVN10__cxxabif120__si-class_type_infoE
- 如何在红帽上强制使用 cxx11 ABI?
- std::regex and dual ABI
- MRB_THROW会导致libc++abi.dylib中的错误
- abi-compliance-checker 中的扩展选项用于什么?
- C++ Linux 上的插件 ABI 问题
- 如果我只使用指向基类的指针,更改私有派生类是否会影响 ABI?
- Centos6 gcc6:编译简单的 c++11 测试文件时,默认的 ABI 不拾取
- 使用共享库版本支持不同 ABI 的最佳实践是什么?
- std::function, Clang 6.0 & MSVC (10.0017134.12) - 可能的 ABI 错误或必需的编译器标志
- Raspberry Pi ARM Float ABI Compatibility