2013-10-04 123 views
4

我目前正在为我的Ubuntu机器上的Raspberry Pi执行一些交叉编译测试。我目前的理解是Raspberry Pi支持硬件浮点,默认的Raspbian OS图像是用硬件浮点(armhf)构建的。正确?Raspberry Pi ARM浮动ABI兼容性

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

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

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

FYI:我的默认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 
+0

你在程序中使用浮点吗? – syam

+0

可能是你的应用程序根本不使用浮点数? – auselen

+0

我试图“打破它”。见上面的编辑。 – pqvst

回答

7

你所有的肯定都是正确的,我只是想补充一点精确的关注点ng Raspbian的armhf

Debian的armhfarm-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

当我在我的Raspberry Pi上运行我的应用程序时,一切都按预期工作。这怎么可能,如果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交叉编译器”即可。这样你就不会感到困扰。