我想创建一个我的嵌入式C代码的构建,它专门检查浮点操作是否不是偶然引入的。我尝试过在我的cortex-m3
处理器架构中添加+nofp
,但是ARM的GCC不喜欢这样(可能是因为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库文件中的东西?
发布于 2021-03-03 03:02:33
这不仅仅是一个库问题。您的目标将使用soft-fp,编译器将提供浮点代码来实现算术运算符,而与库无关。
我通常采用的解决方案是扫描map文件,查找编译器提供的浮点例程的实例。如果你的代码是"fp整洁的“,就不会有这样的引用。数学库和执行浮点算术运算的任何其他代码都将使用这些运算符实现,因此您只需查找这些运算符调用,并可以忽略Newlib数学库函数。
https://gcc.gnu.org/onlinedocs/gccint/Soft-float-library-routines.html中列出了内部软fp例程。手动检查fp符号的映射文件可能是可行的,但您可以自己编写一个脚本或工具来扫描映射文件中的这些名称,以检查您的。映射文件的交叉引用部分将列出使用这些符号的所有模块,因此您可以使用它来识别使用浮点代码的位置。
Newlib stdio函数默认支持浮点。如果您的格式化I/O仅限于printf()
,那么您可以改用iprintf()
,或者您可以在未定义FLOATING_POINT
的情况下重新构建Newlib,以便从除scanf()
之外的所有库中删除浮点支持(不知道为什么)。然后,您可以再次使用映射文件技术来查找“被禁止”的格式化I/O函数(尽管这些函数在任何情况下都可能使用浮点运算符函数,因此您已经间接地发现了它们)。
另一种方法是使用替代的stdio库来覆盖Newlib版本。您可以使用任意数量的“微型printf”实现。如果您将这样的库链接为目标代码,或者在link命令中将其库列在Newlib之前,它将覆盖Newlib版本。
https://stackoverflow.com/questions/66444111
复制相似问题