Min*_*ons 5 c floating-point arm cross-compiling
我最近为arm目标编写了c应用程序.为了交叉编译arm目标的应用程序,-mfloat-abi=hard必须使用一个标志.但我实际上并不明白这意味着什么.有人可以解释一下这个国旗的含义.编译应用程序时会有什么变化?
区别在于调用约定。ARM使用基于寄存器的调用约定,在该约定中,函数的参数(达到上限,之后它们开始溢出到栈中)和返回值都在寄存器中传递(有关详细信息,请参见程序调用标准)。对于浮点值,是否存在硬件FPU协处理器会给如何处理浮点值带来一点难题,在生成代码时提供了两种可能性:
硬浮动:你认为浮点硬件的存在,并且FP参数和返回值FPU寄存器传递。这是更有效的,当你这样做有一个FPU,但不能移植到机器无一物,何处代码将炸毁试图不存在访问寄存器。
软浮点数:浮点参数在通用寄存器中传递,方式与32位或64位整数相同。如果有硬件支持,则被调用方函数可以将它们转移到FPU寄存器中以完成其工作,或者如果没有硬件支持,则回退到浮点仿真。因此,即使在真正的FPU硬件上,代码也可以在适当的库支持下在任何地方工作,而付出的开销却很小(对于琐碎的功能而言,这可能变得尤为重要)。
由此,您可以推断出无法将两者混为一谈- 可以将函数调用编译为软浮点数,但是可以链接到实现该函数的硬浮点库-您的调用代码可能会将浮点参数放在r1,但是被调用方代码会在其中查找s0并继续使用其中存在的任何垃圾值来计算废话。同样,库函数随后将在中返回一个浮点结果s0,但是您的代码将因遗留的任何内容而运行r0,甚至出错。
因此,如果您的工具链提供了硬浮动库,则仅当您将代码编译为硬浮动时才可以链接到它们,反之亦然。请注意,multilib的神奇之处在于,单个工具链可能会同时支持两个库,方法是同时拥有每个库的两个版本,并在链接时自动选择正确的库。
看一下文档:
\n\n\n\n\n\n
-mfloat-abi=name\n 指定要使用的浮点 ABI。允许的值为: \xe2\x80\x98soft\xe2\x80\x99、\xe2\x80\x98softfp\xe2\x80\x99 和 \xe2\x80\x98hard\xe2\x80\x99。\n 指定 \xe2\x80 \x98soft\xe2\x80\x99 导致 GCC 生成包含浮点运算的库调用的输出。\xe2\x80\x98softfp\xe2\x80\x99 允许使用硬件浮点指令生成代码,但仍使用软浮点调用约定。\xe2\x80\x98hard\xe2\x80\x99 允许生成浮点指令并使用 FPU 特定的调用约定。
默认值取决于具体的目标配置。请注意,硬浮点和软浮点 ABI 不兼容链接;您必须使用相同的 ABI 编译整个程序,并链接到一组兼容的库。
\n\n这意味着hard使用特定于硬件的浮点指令。soft不会使用这些指令,但它将作为软件库实现 FP 操作。
最后,这softfp意味着它将使用soft调用约定(和其他 ABI),即它不会使用 FP 硬件寄存器来传递或获取参数,但它将使用硬件 FP 指令(如果可用)。
和是链接兼容soft的softfp,即它们使用相同的 ABI,因此您可以在同一个程序中混合使用它们。但hard将使用硬件寄存器进行参数传递,因此它不能与其他两者混合。
使用哪一个?嗯,这取决于您使用的系统。操作系统库将为一种 ABI 或另一种进行编译,本机编译器将仅使用它。但如果您使用交叉编译器,那么您可能需要手动指定 ABI。
\n\n例外情况是,如果您使用具有 ABI 的操作系统soft,并且在您知道能够进行硬 FP 的硬件中运行它,那么您可以将程序编译为softfp并利用该功能,而无需中断链接。