GCC [for ARM] 强制无浮点

问题描述

我想创建我的嵌入式 C 代码的构建,专门检查浮点运算不是偶然引入的。我已经尝试将 +nofp 添加到我的 [cortex-m3] 处理器架构中,但是 GCC for ARM 不喜欢那样(可能是因为 cortex-m3 没有浮点单元)。我试过指定 -mfpu=none 但这不是允许的选项。我曾尝试将 -lm 排除在链接器命令行之外,但链接器似乎太聪明了,不会被它愚弄,并且正在编译包含 double代码并无论如何都解析 pow()。>

这篇文章:2011 年的 https://gcc.gnu.org/legacy-ml/gcc-help/2011-07/msg00093.html 暗示 GCC 没有这样的选择,因为没有人对它感兴趣,这让我感到惊讶,因为它似乎是一种普遍想要的东西,至少从嵌入式的角度来看,避免意外的 C 库膨胀。

有没有人知道用 GCC/newlib 做到这一点的方法,而我不必通过它选择的 C 库文件手动破解内容

解决方法

这不仅仅是图书馆的问题。您的目标将使用 soft-fp,并且编译器将提供浮点代码来实现算术运算符,而不管库如何。

我通常应用的解决方案是扫描映射文件以查找编译器提供的浮点例程的实例。如果您的代码是“fp clean”,则不会有此类引用。数学库和任何其他执行浮点算术运算的代码都将使用这些运算符实现,因此您只需查找这些运算符调用即可,而可以忽略 Newlib 数学库函数。

内部 soft-fp 例程在 https://gcc.gnu.org/onlinedocs/gccint/Soft-float-library-routines.html 中列出。手动检查地图文件中的 fp 符号可能是可行的,但您可以自己编写脚本或工具来扫描地图文件中的这些名称以检查您的。映射文件的交叉引用部分将列出使用这些符号的所有模块,以便您可以使用它来确定使用浮点代码的位置。

Newlib stdio 函数默认支持浮点。如果您的格式化 I/O 仅限于 printf(),您可以使用 iprintf() 代替,或者您可以使用 FLOATING_POINT undefined 重建 Newlib 以移除除 scanf() 之外的所有浮点支持(否知道为什么)。然后,您可以再次使用映射文件技术来查找“禁止的”格式化 I/O 函数(尽管这些函数在任何情况下也可能使用浮点运算符函数,因此您已经间接地发现了它们)。

另一种方法是使用替代的 stdio 库来覆盖 Newlib 版本。您可以使用任意数量的“微型 printf”实现。如果您将此类库链接为目标代码或在链接命令中将其库列在 Newlib 之前,它将覆盖 Newlib 版本。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...