GCC [for ARM] 强制无浮点

如何解决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 版本。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?